類間關係
在類圖中,除了須要描述單獨的類的名稱、屬性和操做外,咱們還須要描述類之間的聯繫,由於沒有類是單獨存在的,它們一般須要和別的類協做,創造比單獨工做更大的語義。在UML類圖中,關係用類框之間的連線來表示,連線上和連線端頭處的不一樣修飾符表示不一樣的關係。類之間的關係有繼承(泛化)、關聯、聚合和組合。
(1)繼承:指的是一個類(稱爲子類)繼承另外的一個類(稱爲基類)的功能,並增長它本身的新功能的能力,繼承是類與類之間最多見的關係。類圖中繼承的表示方法是從子類拉出一條閉合的、單鍵頭(或三角形)的實線指向基類。例如,圖3.2給出了MFC中 CObject類和菜單類CMenu的繼承關係。
圖3.2 類的繼承
類的繼承在C++中呈現爲:
class B { }
class A : public B{ }
(2)關聯:指的是模型元素之間的一種語義聯繫,是類之間的一種很弱的聯繫。關聯能夠有方向,能夠是單向關聯,也能夠是雙向關聯。能夠給關聯加上關聯名來描述關聯的做用。關聯兩端的類也能夠以某種角色參與關聯,角色能夠具備多重性,表示能夠有多少個對象參與關聯。能夠經過關聯類進一步描述關聯的屬性、操做以及其餘信息。關聯類經過一條虛線與關聯鏈接。對於關聯能夠加上一些約束,以增強關聯的含義。
關聯在C++中呈現爲:
class A{...}
class B{ ...}
A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)
即一個類做爲另外一個類方法的參數。
(3)聚合:指的是總體與部分的關係。一般在定義一個總體類後,再去分析這個總體類的組成結構。從而找出一些組成類,該總體類和組成類之間就造成了聚合關係。例如一個航母編隊包括海空母艦、驅護艦艇、艦載飛機及核動力***潛艇等。需求描述中「包含」、「組成」、「分爲…部分」等詞常意味着聚合關係。
(4)組合:也表示類之間總體和部分的關係,可是組合關係中部分和總體具備統一的生存期。一旦總體對象不存在,部分對象也將不存在。部分對象與總體對象之間具備共生死的關係。
聚合和組合的區別在於:聚合關係是「has-a」關係,組合關係是「contains-a」關係;聚合關係表示總體與部分的關係比較弱,而組合比較強;聚合關係中表明部分事物的對象與表明聚合事物的對象的生存期無關,一旦刪除了聚合對象不必定就刪除了表明部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了表明部分事物的對象。
咱們用淺顯的例子來講明聚合和組合的區別。「國破家亡」,國滅了,家天然也沒有了,「國」和「家」顯然也是組合關係。而相反的,計算機和它的外設之間就是聚合關係,由於它們之間的關係相對鬆散,計算機沒了,外設還能夠獨立存在,還能夠接在別的計算機上。在聚合關係中,部分能夠獨立於聚合而存在,部分的全部權也能夠由幾個聚合來共享,好比打印機就能夠在辦公室內被廣大同事共用。
在C++語言中,從實現的角度講,聚合能夠表示爲:
class A {...}
class B { A* a; .....}
即類B包含類A的指針;
而組合可表示爲:
class A{...}
class B{ A a; ...}
即類B包含類A的對象。
準確的UML類圖中用空心和實心菱形對聚合和組合進行了區分。
圖3.4 聚合和組合
聚合,關聯,組合 是對象之間的三種關係。從某種意義上說,繼承是一種類的縱向關係,而聚合,關聯,組合是對象的橫向關係。
其關係強弱爲 關聯<聚合<組合
關聯和聚合的區別主要在語義上,關聯的兩個對象之間通常是平等的,例如你是個人朋友,聚合則通常不是平等的,例如一個公司包含了不少員工,其實現上是差很少的。聚合和組合的區別則在語義和實現上都有差異,組合的兩個對象之間其生命期有很大的關聯,被組合的對象是在組合對象建立的同時或者建立以後建立,在組合對象銷燬以前銷燬。通常來講被組合對象不能脫離組合對象獨立存在,並且也只能屬於一個組合對象,例如一個文檔的版本,必須依賴於文檔的存在,也只能屬於一個文檔。聚合則不同,被聚合的對象能夠屬於多個聚合對象,例如一個員工可能能夠屬於多個公司。
我想舉個通俗的例子。
你和你的心臟之間是composition關係(心臟只屬於本身)
你和你買的書之間是aggregation關係(書多是別人的)
你和你的朋友之間是association關係
聚合與組合的區別:聚合∶分散的彙集到一塊兒 組合∶幾個獨立部分組成的總體 由上可見,聚合就像將不一樣的水果放到一個玻璃果盤裏,玻璃果盤摔壞,並不影響水果。
Trackback:http://blog.csdn.net/baobeiSimple/archive/2007/06/12/1648617.aspx