Composition, Aggregation and Association

平常不管是写代码或者是读代码,为了清晰的表示类与类之间的关系,我们需要画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框架源码,有一起玩耍的么?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章