一、六大關系
繼承/泛化(Generalization):
指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關系;在Java中此類關系通過關鍵字
extends
明确辨別,在設計時一般沒有争議性;
實作(Realization):
指的是一個class類實作interface接口(可以是多個)的功能;實作是類與接口之間最常見的關系;在Java中此類關系通過關鍵字
implements
明确辨別,在設計時一般沒有争議性;
依賴(Dependency):
可以簡單的了解,就是一個類A使用到了另一個類B,而這種使用關系是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A;
比如:某人要過河,需要借用一條船,此時人與船之間的關系就是依賴;
表現在代碼層面:
為類B作為參數被類A在某個method方法中使用;
關聯(association):
他展現的是兩個類、或者類與接口之間語義級别的一種強依賴關系,比如我和我的朋友;這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的、關聯可以是單向、雙向的;
表現在代碼層面:
為被關聯類B以類屬性的形式出現在關聯類A中
,
也可能是關聯類A引用了一個類型為被關聯類B的全局變量
;
聚合(aggregation):
聚合是關聯關系的一種特例,他展現的是整體與部分、擁有的關系,即
has - a
的關系,此時整體與部分之間是可分離的,他們可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享;
比如:計算機與CPU、公司與員工的關系等;
表現在代碼層面:和關聯關系是一緻的,隻能從語義級别來區分;
組合(composition):
組合也是關聯關系的一種特例,他展現的是一種
contains - a
的關系,這種關系比聚合更強,也稱為強聚合;他同樣展現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味着部分的生命周期結束;
比如:你和你的大腦;
表現在代碼層面:和關聯關系是一緻的,隻能從語義級别來區分;
對于繼承、實作這兩種關系沒多少疑問,他們展現的是一種類與類、或者類與接口間的縱向關系;
其他的四者關系則展現的是類與類、或者類與接口間的引用、橫向關系,是比較難區分的,有很多事物間的關系要想準備定位是很難的,前面也提到,這幾種關系都是語義級别的,是以從代碼層面并不能完全區分各種關系;
但總的來說,後幾種關系所表現的強弱程度依次為:
組合>聚合>關聯>依賴
;
聚合跟組合其實都屬于關聯 隻不過它們是兩種特殊的關聯 因為本是同根生 是以它們之間難免會有相似之處 下面讓我們一起來看一下它們之間有何不同
聚合與組合的概念相信不用我在此贅述大家就已經了解了 下面直接上例子
程老師的《大話》裡舉大那個大雁的例子很貼切 在此我就借用一下 大雁喜歡熱鬧害怕孤獨 是以它們一直過着群居的生活 這樣就有了雁群 每一隻大雁都有自己的雁群 每個雁群都有好多大雁 大雁與雁群的這種關系就可以稱之為聚合 另外每隻大雁都有兩隻翅膀 大雁與雁翅的關系就叫做組合 有此可見 聚合的關系明顯沒有組合緊密 大雁不會因為它們的群主将雁群解散而無法生存 而雁翅就無法脫離大雁而單獨生存——組合關系的類具有相同的生命周期
二、關系之間的差別 ★
1.聚合與組合
(1)聚合與組合都是一種結合關系,隻是額外具有整體-部分的意涵。
(2)部件的生命周期不同
聚合關系中,整件不會擁有部件的生命周期,是以整件删除時,部件不會被删除。再者,多個整件可以共享同一個部件。
組合關系中,整件擁有部件的生命周期,是以整件删除時,部件一定會跟着删除。而且,多個整件不可以同時間共享同一個部件。
(3)聚合關系是“has - a”關系,組合關系是“contains - a”關系。
2.關聯和聚合
(1)表現在代碼層面,和關聯關系是一緻的,隻能從語義級别來區分。
(2)關聯和聚合的差別主要在語義上,關聯的兩個對象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的。
(3)關聯是一種結構化的關系,指一種對象和另一種對象有聯系。
(4)關聯和聚合是視問題域而定的,例如在關心汽車的領域裡,輪胎是一定要組合在汽車類中的,因為它離開了汽車就沒有意義了。但是在賣輪胎的店鋪業務裡,就算輪胎離開了汽車,它也是有意義的,這就可以用聚合了。
3.關聯和依賴
(1)關聯關系中,展現的是兩個類、或者類與接口之間語義級别的一種強依賴關系,比如我和我的朋友;這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,而且雙方的關系一般是平等的。
(2)依賴關系中,可以簡單的了解,就是一個類A使用到了另一個類B,而這種使用關系是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A。
三、六大聯系線條/箭頭 ★
泛化 /繼承:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3ETNzUzMxcTM1EzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)