描述對象的附屬[也就是依賴]關係: 關聯<聚合<組合, 依賴關係是逐漸加強的
關聯
關聯(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; ...}