美文网首页
Composition, Aggregation and Ass

Composition, Aggregation and Ass

作者: SunnyZhou1024 | 来源:发表于2020-04-05 23:11 被阅读0次

    平常不管是写代码或者是读代码,为了清晰的表示类与类之间的关系,我们需要画UML图。而想要清晰明了的表达类之间的关系,首先要直到它们之间都存在一些什么关系。
    简单的说,类与类之间通常有以下这几种关系:

    1. 继承(Inheritance);
    2. 实现(Implementation);
    3. 泛化(Generalization);
    4. 联合(Association);
    5. 聚合(Aggregation);
    6. 组合(Composition)。

    继承、实现、泛化都容易理解,但是联合、聚合、组合有什么区别呢?这里使用下面的例子来说明。

    class Bed;                                                                      
    class Chair;
    class Table;
    class Cup;
    
    class Room {
        public:
            Room(Bed *bed = nullptr, Chair *chairs = nullptr, Table *table = nullptr):
                bed_(bed), chairs_(chairs), table_(table) {}
    
        private:
            Bed *bed_;
            Chair *chairs_;
            Table *table_;
    };
    class House {
        public:
            House() {}
    
        private:
            Room room;
    };
    
    
    class Bed {};
    class Chair {};
    class Table {
        public:
            Table() {}
            void support(Cup &cup) {}
    };
    class Cup {
        public:
            Cup() {}
            void decorate(Table &table) {}
    };
    
    
    

    Composition

    组合表示类B是类A的一部分,并且类B的生命周期依赖与类A,如果类A被销毁了,那么类B也将随之被销毁。
    例如房间是一栋房子的一部分,房子如果没有了,房间也就没有了。

    class Room {
        public:
            Room() {}
    };
    class House {
        public:
            House() {}
    
        private:
            Room room;
    };
    

    组合的UML表示方法如下图所示:


    Composition

    Aggregation

    聚合用于表示类B是类A的一部分,或者说类A中含有类B,但与组合不同的是,类B的声明周期并不依赖与类A。类A被销毁了类B 仍然可以继续存在。
    例如房间里的桌椅板凳在房间被拆了仍然可以继续存在。

    class Bed {};
    class Table {};
    class Chair {};
    
    class Room {
        public:
            Room(Bed *bed = nullptr, Chair *chairs = nullptr, Table *table = nullptr):
                bed_(bed), chairs_(chairs), table_(table) {}
    
        private:
            Bed *bed_;
            Chair *chairs_;
            Table *table_;
    };
    

    聚合的UML表示方法如下图所示:

    Aggregation

    Association

    联合表示两个类之间存在一种交互关系,而它们本身并不存在谁包含谁的关系。

    class Table {
        public:
            Table() {}
            void support(Cup &cup) {}
    };
    
    class Cup {
        public:
            Cup() {}
            void decorate(Table &table) {}
    };
    
    

    联合的UML表示方法如下图所示:


    Association 本文首发于个人微信公众号TensorBoy,微信扫描上方二维码或者微信搜索TensorBoy并关注,及时获取最新文章。C++ | Python | 推理引擎 | AI框架源码,有一起玩耍的么?

    相关文章

      网友评论

          本文标题:Composition, Aggregation and Ass

          本文链接:https://www.haomeiwen.com/subject/aippphtx.html