關聯(Association), 聚合(Aggregation), 組合(Composition)解析

描述對象的附屬[也就是依賴]關係: 關聯<聚合<組合, 依賴關係是逐漸加強的

關聯

關聯(association)是一種很寬泛的關係,它表示一個對象a用到了另一個對象b,調用了後者的成員函數。從代碼形式上看,a持有b的指針或引用,但是b的生命期不能由a單獨控制。例如:

class A
{
private:
B* itsB;
};

聚合

聚合(aggregation)是一種特殊的聯繫,它表明了“部分”到“整體”的關係,顯著的特點就是不能包含循環的聯繫 (就是說,部分中不能包含整體)。如:


class Node
{
private:
vector<Node*> itsNodes;
};
上述代碼只有當子節點不會成爲父節點的父節點時(即,必須是樹結構,不能是圖結構),才能稱之爲聚合。

從實現的角度講,聚合可以表示爲: 

class A {...} class B { A* a; .....} 

 

組合

組合(composition)跟聚合幾乎相同,唯一的區別就是“部分”不能脫離“整體”單獨存在,就是說, “部分”的生命期不能比“整體”還要長。例如:


class Car
{
public:
virtual ~Car() {delete itsCarb;}
private:
Carburetor* itsCarb
};

從實現的角度講,組合實現的形式是: 

class A{...} class B{ A a; ...}
 

 

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