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框架源碼,有一起玩耍的麼?

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