1. 程式人生 > 其它 >繼承/泛化、實現、依賴、關聯、聚合、組合的聯絡與區別

繼承/泛化、實現、依賴、關聯、聚合、組合的聯絡與區別

原文:java_UML:繼承/泛化、實現、依賴、關聯、聚合、組合的聯絡與區別 (2016-07-12) - scevecn - 部落格園 (cnblogs.com)

分別介紹這幾種關係:

UML關係:繼承(泛化)、實現、依賴、關聯、聚合、組合的聯絡與區別

一、表示符號上的區別

二、具體區別與聯絡

1.繼承/泛化(Generalization)

  【泛化關係】:是一種繼承關係,表示一般與特殊的關係,它指定了子類如何特化父類的所有特徵和行為。例如:老虎是動物的一種,即有老虎的特性也有動物的共性。繼承是類與類或者介面與介面之間最常見的關係;在Java中此類關係通過關鍵字extends明確標識,在設計時一般沒有爭議性。

  【箭頭指向】:帶三角箭頭的實線,箭頭指向父類

  2.實現(Realization)

  【實現關係】:是一種類與介面的關係,表示類是介面所有特徵和行為的實現.一個class類實現interface介面(可以是多個)的功能;實現是類與介面之間最常見的關係;在Java中此類關係通過關鍵字implements明確標識,在設計時一般沒有爭議性;

  【箭頭指向】:帶三角箭頭的虛線,箭頭指向介面

3.依賴(Dependency)

  【依賴關係】:是一種使用的關係,即一個類的實現需要另一個類的協助,所以要儘量不使用雙向的互相依賴.一個類A使用到了另一個類B,而這種使用關係是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A;比如某個老師要授課,則需要有這麼一門課讓他教授,此時老師與課之間的關係就是依賴;

  【程式碼表現】:區域性變數、方法的引數或者對靜態方法的呼叫

  【箭頭及指向】:帶箭頭的虛線,指向被使用者

  4.關聯(Association)

【關聯關係】:是類與類之間的聯接,它使一個類知道另一個類的屬性和方法。兩個類或者類與介面之間語義級別的一種強依賴關係,這種關係比依賴更強,一般是長期性的,而且雙方的關係一般是平等的。比如:老師與學生,丈夫與妻子關聯可以是雙向的,也可以是單向的。雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。

  【程式碼體現】:成員變數/全域性變數

  【箭頭及指向】:帶普通箭頭的實心線,指向被擁有者

  上圖中,老師與學生是雙向關聯,老師有多名學生,學生也可能有多名老師。但學生與某課程間的關係為單向關聯,一名學生可能要上多門課程,課程是個抽象的東西他不擁有學生。

  下圖為自身關聯:

  5.聚合(Aggregation)

  【聚合關係】:關聯關係的一種特例,是強的關聯關係.聚合是整體與部分的關係,且部分可以離開整體而單獨存在,他們可以具有各自的生命週期,部分可以屬於多個整體物件,也可以為多個整體物件共享,比如計算機與CPU、公司與員工、車和輪胎的關係等;表現在程式碼層面,和關聯關係是一致的,只能從語義級別來區分;

聚合關係也是使用例項變數實現的.從java語法上是分不出關聯和聚合的.關聯關係中兩個類是處於相同的層次,而聚合關係中兩不類是處於不平等的層次,一個表示整體,一個表示部分.

  【程式碼體現】:成員變數/全域性變數

  【箭頭及指向】:帶空心菱形的實心線,菱形指向整體

  6.組合(Composition)

  【組合關係】:也是關聯關係的一種特例,是比聚合關係還要強的關係,也稱為強聚合;他同樣體現整體與部分間的關係,但此時整體與部分是不可分的,整體的生命週期結束也就意味著部分的生命週期結束;比如:公司和部門是整體和部分的關係,沒有公司就不存在部門合成關係不能共享。

組合跟聚合幾乎相同,唯一的區別就是"部分"不能脫離"整體"單獨存在,就是說,"部分"的生命期不能比"整體"還要長。

【程式碼體現】:成員變數/全域性變數

【箭頭及指向】:帶實心菱形的實線,菱形指向整體

  各種關係的強弱順序:

  泛化=實現>組合>聚合>關聯>依賴

  下面這張UML圖,比較形象地展示了各種類圖關係:

三、綜合比較

1.聚合與組合

(1)聚合與組合都是一種結合關係,只是額外具有整體-部分的意涵。

(2)部件的生命週期不同

聚合關係中,整件不會擁有部件的生命週期,所以整件刪除時,部件不會被刪除。再者,多個整件可以共享同一個部件。

組合關係中,整件擁有部件的生命週期,所以整件刪除時,部件一定會跟著刪除。而且,多個整件不可以同時間共享同一個部件。

(3)聚合關係是"has-a"關係,組合關係是"contains-a"關係。

2.關聯和聚合

(1)表現在程式碼層面,和關聯關係是一致的,只能從語義級別來區分。

(2)關聯和聚合的區別主要在語義上,關聯的兩個物件之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的。

(3)關聯是一種結構化的關係,指一種物件和另一種物件有聯絡。

(4)關聯和聚合是視問題域而定的,例如在關心汽車的領域裡,輪胎是一定要組合在汽車類中的,因為它離開了汽車就沒有意義了。但是在賣輪胎的店鋪業務裡,就算輪胎離開了汽車,它也是有意義的,這就可以用聚合了。

3.關聯和依賴

(1)關聯關係中,體現的是兩個類、或者類與介面之間語義級別的一種強依賴關係,比如我和我的朋友;這種關係比依賴更強、不存在依賴關係的偶然性、關係也不是臨時性的,一般是長期性的,而且雙方的關係一般是平等的。

(2)依賴關係中,可以簡單的理解,就是一個類A使用到了另一個類B,而這種使用關係是具有偶然性的、臨時性的、非常弱的,但是B類的變化會影響到A。

4.綜合比較

這幾種關係都是語義級別的,所以從程式碼層面並不能完全區分各種關係;但總的來說,後幾種關係所表現的強弱程度依次為:

組合>聚合>關聯>依賴