UML中類之間的幾種關係小結(包括類圖之間的關係符號)

原文鏈接:https://blog.csdn.net/u012871914/article/details/80280644

由於最近這段時間一直在看設計模式,因此接觸了很多類關係圖,發現自己以前對於UML中類之間的關係的基礎知識掌握的不是很牢固,因此,寫一篇博文用來重溫與鞏固一下相關的知識。

在面向對象程序設計時,類與類之間的關係主要分爲繼承,實現,依賴,關聯,聚合,組合六種關係。其中前兩種理解很簡單,重點是比較容易混淆的後四種。

繼承(或叫泛化):指的是一個類(稱爲子類、子接口)繼承另外的一個類(稱爲父類、父接口)的功能,並可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關係;  類圖如下


實現(realization)指的是一個class類實現interface接口(可以是多個)的功能;實現是類與接口之間最常見的關係;在Java中此類關係通過關鍵字implements明確標識; 類圖如下


依賴(dependency):依賴關係作爲類與類之間關係的一種,代表的是一個類依賴於另一個類的實現,這種關係的方向是單向的,即類B的變化會影響到類A,反過來則不成立,這種依賴關係具有偶然性,臨時性,是比較弱的關係,在代碼中,表現爲類B作爲參數被類A的方法調用。在Java中,表現爲,類B是類A的局部變量,方法中的參數和對靜態方法的調用。 類圖如下


關聯(association)

關係表示類與類之間的連接,它使得一個類知道另外一個類的屬性和方法。

關聯可以使用單箭頭表示單向關聯,使用雙箭頭或者不適用箭頭表示雙向關聯,不建議使用雙向關聯,關聯有兩個端點,每個端點可以有一個基數,表示這個關聯的類可以有幾個實例。

0..1 表示可以有0個或者1個實例

0..* 表示對實例的數目沒有限制

1     表示只能有一個實例

1..* 表示至少有一個實例

關聯關係體現的是兩個類,或者類與接口之間的強依賴關係,這種關係很強烈,比依賴更強,表現在代碼層面,爲被關聯的類B以類屬性的形式出現在類A中,也可能是關聯類A引用了被關聯類B的全局變量

在Java中,關聯關係是使用實例變量來實現的


聚合(aggregation)是關聯關係的特例,是強的關聯關係,聚合是整個與個體的關係,即has-a關係,此時整體和部分是可以分離的,他們具有各自的生命週期,部分可以屬於多個對象,也可以被多個對象共享;比如計算機和CPU,公司與員工的關係;在代碼層面聚合與關聯是一致的,只能從語義上來區分

聚合關係也是使用實例變量來實現的,在java語法上區分不出關聯和聚合,關聯關係中類出於一個層次,而聚合則明顯的在兩個不同的層次。


組合(compostion)也是關聯關係的一種特例,體現的是一種contain-a關係,比聚合更強,是一種強聚合關係。它同樣體現整體與部分的關係,但此時整體與部分是不可分的,整體生命週期的結束也意味着部分生命週期的結束,反之亦然。如大腦和人類。

體現在代碼層面與關聯時一致的,只能從語義來區分。

組合與聚合幾乎完全相同,唯一區別就是對於組合,“部分”不同脫離“整體”單獨存在,其生命週期應該是一致的。


總結:

主要是關聯關係的細化需要注意強弱,由若到強分別是 依賴 < 關聯 < 聚合 < 組合


參考(https://www.cnblogs.com/jiyuqi/p/4571543.html)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章