程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> UML關系:繼承/泛化、實現、依賴、關聯、聚合、組合的聯系與區別 2016-07-12,uml2016-07-12

UML關系:繼承/泛化、實現、依賴、關聯、聚合、組合的聯系與區別 2016-07-12,uml2016-07-12

編輯:JAVA綜合教程

UML關系:繼承/泛化、實現、依賴、關聯、聚合、組合的聯系與區別 2016-07-12,uml2016-07-12


分別介紹這幾種關系:

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.綜合比較

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

組合>聚合>關聯>依賴

 

結合了兩篇博客如下:

http://blog.sina.com.cn/s/blog_94c2c46a0102vaiz.html

http://blog.csdn.net/wzjking0929/article/details/51803110

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved