UML的關聯(Association), 聚合(Aggregation), 組合(Composition)區別


轉載:http://blog.csdn.net/ocean181/article/details/6117369

UML的關聯(Association), 聚合(Aggregation), 組合(Composition)區別 

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

 

inheritance: "a kind of": 貓是一種動物,說明貓從動物繼承;

 

association: 兩者之間存在某種關聯即可,很弱的關系,如student and course, 每個學生可以選不同的課,每門課上有不同學生;

aggregation: "consist of":整體與部分之間的關系,但這里部分可以脫離整體單獨存在,如MP3上所插的耳機,MP3包含耳機,但這個耳機也可以單獨存在,或者插在其他電腦上。

composition: 更強的aggregation,這里部分不能脫離整體而存在,這個部分是整體的私有財產。比如Apple Itouch上的電池,原則不能拆下來單獨使用。

 

關聯

關聯(association)表明某個對象可以向另一個對象通過某種方式發送消息。發送消息的方法可以通過指針成員變量, 也可以是方法參數、局部變量等等。例如:

uml-aac-diff-01.png
class A
{
private:
B* itsB;
};

聚合

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

uml-aac-diff-02.png
class Node
{
private:
vector<Node*> itsNodes;
};

上述代碼只有當子節點不會成為父節點的父節點時(即,必須是樹結構,不能是圖結構),才能稱之為聚合。

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

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

 

組合

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

uml-aac-diff-03.png
class Car
{
public:
virtual ~Car() {delete itsCarb;}
private:
Carburetor* itsCarb
};

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM