UML中Association(關聯), Aggregation(聚合), Composition(組合)和Dependency(依賴)辨析

<1>依賴

依賴關係用虛線加箭頭表示,如圖所示:


上圖表示:Animal類依賴於Water類(動物依賴於水)。

依賴是類的五種關係中耦合最小的一種關係。因爲依賴關係在生成代碼的時候,這兩個關係類都不會增加屬性。這種微弱的關係可以用類之間的相互瞭解的程度來說明。(下圖爲代碼生成圖)

 

由上圖可見生成的代碼中Animal類的屬性中沒有增加Water類。那麼Animal類如何使用Water類呢,有三種方式:


依賴關係的三種表現形式:

① Water類是全局的,則Animal類可以調用它

② Water類是Animal類的某個方法中的變量,則Animal類可以調用它。代碼演示如下:


PS:Animal有一個長大(GrownUp)方法,Water類作爲該方法的變量來使用。
請注意Water類的生命期,它是當Animal類的GrounUp方法被調用的時候,才被實例化。
持有Water類的是Animal的一個方法而不是Animal類,這點是最重要的。

③ Water類是作爲Animal類中某個方法的參數或者返回值時。代碼演示如下


無用多說,Water類被Animal類的一個方法持有。生命期隨着方法的執行結束而結束。

在依賴關係中,必須採用這三種方法之一。


<2>關聯

關聯是實線加箭頭表示。表示類之間的耦合度比依賴要強。

例:水與氣候是關聯的,表示圖如下


生成代碼如下:


可見生成的代碼中,Water類的屬性中增加了Climate類。


關聯既有單向關聯又有雙向關聯。

單向關聯:Water類和Climate類單向關聯(如下圖),則Water類稱爲源類,Climate類稱爲目標類。源類瞭解目標類的所有的屬性和方法,但目標類並不瞭解源類的信息。


雙向關聯:源類和目標類相互瞭解彼此的信息。如將Water類和Climate類之間改爲雙向關聯,如下圖 

 


依賴和關聯的區別:

① 從類的屬性是否增加的角度看:

發生依賴關係的兩個類都不會增加屬性。其中的一個類作爲另一個類的方法的參數或者返回值,或者是某個方法的變量而已。

發生關聯關係的兩個類,其中的一個類成爲另一個類的屬性,而屬性是一種更爲緊密的耦合,更爲長久的持有關係。

② 從關係的生命期角度看:

依賴關係是僅當類的方法被調用時而產生,伴隨着方法的結束而結束了。

關聯關係是當類實例化的時候即產生,當類銷燬的時候,關係結束。相比依賴講,關聯關係的生存期更長。


關聯關係的細化

關聯關係又可以細化爲聚合關係和組合關係

聚合關係圖:


組合關係圖:


l 聚合和組合的區別:

由於聚合和組合都是特殊的關聯關係,在生成的代碼上看不出區別,都是關聯的形式。那到底這兩種關係如何來區分呢。

區分的關鍵有兩點:

① 構造函數不同

聚合關係下:雁羣類(GooseGroup)和大雁類(Goose)代碼如下:


組合關係下:大雁類(Goose)和翅膀類(Wings)代碼如下:


這兩種關係的區別在於:

①構造函數不同

聚合類的構造函數中包含了另一個類作爲參數。

雁羣類(GooseGroup)的構造函數中要用到大雁(Goose)作爲參數傳遞進來。大雁類(Goose)可以脫離雁羣類而獨立存在。

組合類的構造函數中包含了另一個類的實例化。

表明大雁類在實例化之前,一定要先實例化翅膀類(Wings),這兩個類緊密的耦合在一起,同生共滅。翅膀類(Wings)是不可以脫離大雁類(Goose)而獨立存在

② 信息的封裝性不同

在聚合關係中,客戶端可以同時瞭解雁羣類和大雁類,因爲他們都是獨立的

而在組合關係中,客戶端只認識大雁類,根本就不知道翅膀類的存在,因爲翅膀類被嚴密的封裝在大雁類中。

文章來自:http://blog.bandao.cn/archive/35755/blogs-679502.aspx

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