平常不管是寫代碼或者是讀代碼,爲了清晰的表示類與類之間的關係,我們需要畫UML圖。而想要清晰明瞭的表達類之間的關係,首先要直到它們之間都存在一些什麼關係。
簡單的說,類與類之間通常有以下這幾種關係:
- 繼承(Inheritance);
- 實現(Implementation);
- 泛化(Generalization);
- 聯合(Association);
- 聚合(Aggregation);
- 組合(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表示方法如下圖所示:
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表示方法如下圖所示:
Association
聯合表示兩個類之間存在一種交互關係,而它們本身並不存在誰包含誰的關係。
class Table {
public:
Table() {}
void support(Cup &cup) {}
};
class Cup {
public:
Cup() {}
void decorate(Table &table) {}
};
聯合的UML表示方法如下圖所示:
首發於個人微信公衆號TensorBoy。微信掃描上方二維碼或者微信搜索TensorBoy並關注,及時獲取更多最新文章!
C++ | Python | 推理引擎 | AI框架源碼,有一起玩耍的麼?