淺談UML中類之間的五種關係及其在程式碼中的表現形式

fan_rockrock發表於2014-01-24

淺談UML中類之間的五種關係及其在程式碼中的表現形式

什麼是類?

將某類東西歸納在一起,可以成為一個類。

類有很多種提煉角度,需要根據系統地目標、業務的場景,選取合適的角度對事物進行歸納。

什麼是類圖?

類圖可能是UML中使用的最多的一種圖。

和其他圖一樣,類圖的基本語法並不複雜,可能一兩天就能掌握,但是真正做到靈活的使用類圖,可能需呀多年的功力。

類圖是鍛鍊OOA(OO Analysis)和OOD(OO Design)思想的重要工具,有助於OOA、OOD思想的提升。

本篇博文,重點講述類圖中類與類之間的關係以及這種關係在程式碼中的實現形式。寫作本文的原因是:網上關於UML類圖的語法規則等的資料很多,但是涉及到關係在程式碼中實現形式的文章卻很少。這是很容易理解的:UML語法規範什麼的各種書上匯出都是,網頁上的也很多都是對各種語法規範的Copy;而類之間的關係反應到程式碼層面需要加入個人的理解。兩者的區別是一個不需要動腦子,Copy過來就行,而另一個需要動腦子。

類與類之間的關係

類與類之間的關係可以根據關係的強度依次分為以下五種:

依賴關係(Dependency)---關聯關係(Association)---聚合(Aggregation)---組合(Composition)---泛化(Generalization)

1.依賴關係(Dependency)

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

 

 這個例子可能不太好(Animal體內有Water,),換一個:

解釋以下:Person 和 Computer之間是沒有關係的,但是由於偶爾的需要,Person需要使用Computer,這時Person就依賴於Computer.

依賴關係是五種關係中耦合最小的一種關係。

類A要完成某個功能必須引用類B,則類A依賴類B。C#不建議雙向依賴,也就是相互引用。

上述依賴關係在程式碼中的表現形式:這兩個關係類都不會增加屬性。

那麼,Person類如何使用Computer類呢?有三種方式:

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

1.Computer類是public的,Person類可以呼叫它。

2.Computer類是Person類中某個方法的區域性變數,則Person類可以呼叫它。程式碼如下:

Person有一個Programing方法,Computer類作為該方法的變數來使用。

注意Computer類的生命週期,當Programing方法被呼叫的時候,才被例項化。

持有Computer類的是Person類的一個方法,而不是Person類,這點是最重要的。

3.Computer類作為Person類中某個方法的引數或返回值。

Computer類被Person類的一個方法所持有,生命週期隨著方法執行結束而結束。

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

2.關聯關係(Association)

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

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

在程式碼中的表現如下:

可見,在Water類屬性中增加了Climate類。

關聯關係有單向關聯、雙向關聯、自身關聯、多維關聯等等。其中後三個可以不加箭頭。

單向關聯:

雙向關聯:

自身關聯:

多維關聯:

關聯和依賴的區別:

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

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

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

  • 從關係的生命週期來看:

依賴關係是僅當類的方法被呼叫時而產生,伴隨著方法的結束而結束了。

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

 3.聚合(Aggregation)

 4.組合(Composition)

引用程傑的《大話設計模式》裡舉大那個大雁的例子 :

大雁喜歡熱鬧害怕孤獨,所以它們一直過著群居的生活,這樣就有了雁群,每一隻大雁都有自己的雁群,每個雁群都有好多大雁,大雁與雁群的這種關係就可以稱之為聚合

另外每隻大雁都有兩隻翅膀,大雁與雁翅的關係就叫做組合

有此可見:

聚合的關係明顯沒有組合緊密,大雁不會因為它們的群主將雁群解散而無法生存;

而雁翅就無法脫離大雁而單獨生存——組合關係的類具有相同的生命週期。

聚合關係圖:

組合關係圖:

 在程式碼中表現如下:

 這兩種關係的區別是:

1.建構函式不同

  • 聚合類的建構函式中包含另一個類的例項作為引數

因為建構函式中傳遞另一個類的例項,因此大雁類可以脫離雁群類獨立存在。

  • 組合類的建構函式包含另一個類的例項化

因為在建構函式中進行例項化,因此兩者緊密耦合在一起,同生同滅,翅膀類不能脫離大雁類存在。

2.資訊的封裝性不同

在聚合關係中,客戶端可以同時瞭解GooseGroup類和Goose類,因為他們是獨立的。

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

5.泛化(Generalization)

泛化是學術名稱,通俗的來講,通常包含類與類之間的繼承關係和類與介面實現關係。

類與類之間的泛化

介面的實現


相關文章