UML中常見關系詳解(泛化、實現、依賴、關聯、組合、聚合)


UML中類與類,已經類與接口,接口與接口的關系有:泛化(generalization),關聯(association),依賴(dependency),實現(realization)這幾種。

 
泛化(generalization)關系時指一個類(子類、子接口)繼承另外一個類(稱為父類、父接口)的功能,並可以增加它自己新功能的能力,繼承是類與類或者接口與接口最常見的關系,在Java中通過關鍵字extends來表示。

 

實現(realization)是指一個class實現interface接口(一個或者多個),表示類具備了某種能力,實現是類與接口中最常見的關系,在Java中通過implements關鍵字來表示。

 

依賴(dependency)關系也是表示類與類之間的連接,表示一個類依賴於另外一個類的定義,依賴關系時是單向的。簡單理解就是類A使用到了類B,這種依賴具有偶然性、臨時性,是非常弱的關系。但是類B的變化會影響到類A。舉個例子,如某人要過河,則人與船的關系就是依賴,人過河之后,與船的關系就解除了,因此是一種弱的連接。在代碼層面,為類B作為參數被類A在某個方法中使用。

在java中,依賴表現為:局部變量,方法中的參數和對靜態方法的調用。

 

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

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

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

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

1     表示只能有一個實例

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

關聯關系體現的是兩個類,或者類與接口之間的強依賴關系,這種關系很強烈,比依賴更強,不是偶然性的,也不是臨時性的,而是一種長期性,相對平等的關系,表現在代碼層面,為被關聯的類B以類屬性的形式出現在類A中,也可能是關聯類A引用了被關聯類B的全局變量。

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

 

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

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

 

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

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

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

 

總結:

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

轉自:http://justsee.iteye.com/blog/808799


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM