Stories

Detail Return Return

UML之組合與聚合 - Stories Detail

關聯和鏈接關係在很多情況下是對稱的,即被關聯的兩個類都有以自己為源端對方為目標端的角色存在,而且角色與源端類的屬性是等價的,即在關聯一端的關聯端(角色)等價於另外一端的屬性。例如,在下圖中,我們可以認為author:Person是類Book的一個屬性,而myBooks:Person是類Person的一個屬性。

關於關聯的詳細信息,可參閲《UML之關聯》一文。
如果希望表達一種非對稱的關係,可以使用“組合”或“聚合”關係進行建模。UML使用實心菱形(組合)或空心菱形(聚合)表達這種關係,菱形放置在關聯線上並靠近關係中的占主導地位的元素。
1.組合
組合表達整體與部分的關係,表示組合的實心菱形放置於表示整體的元素的那一端,如下圖所示。

在上圖表示的組合關係中,靠近Cover的一端給出了多重性值2,而靠近Book的一端未給出多重性,此時它的多重性值將默認為1。這張圖描畫的模型表明封面(Cover)是書(Book)的一部分,並且一本書包含有兩個封面(封面和封底)。
使用組合關係時,“整體”的生命週期將決定“部分”的生命週期。例如在上例建模的場景下,如果我們刪除(或者在現實世界中我們焚燬)一本書(Book),則封面(Cover)也將被刪除(或焚燬)。
“整體”端一側的多重性值只能是[1]或者[0..1](注意:在組合關係建模時多重性不需要前後的中括號[ ],參見上圖)。例如在上例中,首先一個封面(Cover)不能被用於多本書(Book);其次,如果封面(Cover)不可以從書(Book)中移除,則菱形所在一側的多重性值只能為[1],如果允許封面(Cover)從書(Book)中移除,則菱形所在一側的多重性值只能為[0..1]。
“部分”端一側的多重性允許是任意的合法值,上例中的封面(Cover)是兩個,即封面和封底。上述多重性也可以使用獨立的組合關係替代,即在Book與Cover之間分別為封面與封底建立組合關係,如下圖所示。

組合作為關聯的一種類型,理論上關聯的所有修飾符都可以應用於組合,不過通常不需要給出組合的名稱,而在理解或描述組合時允許有類似以下的説法:
一本書由兩個封面組成。
一本書有兩個部分是封面。
一個封面是一本書的一部分。
組合是一種非對稱的關係:一本書(Book)可以有封面(Cover)作為它的一部分,而一個封面(Cover)不能將同一本書(Book)作為它的一部分。
組合具有傳遞性,這意味着如果類C是類B的一部分,而類B是類A的一部分,則類C也是類A的一部分。例如某個類(Class)由名稱(Name)和屬性(Attribute)組成,而屬性(Attribute)又有它的組成部分。如果刪除類(Class),則不只是名稱(Name)和屬性(Attribute)會被刪除,組成屬性(Attribute)的Name、Type、Mult也將被刪除。

使用類似上圖的樹形結構在描述組合或聚合關係非常常見,例如對材料清單、元模型或過程分解建模時都可以使用樹形結構。
2.聚合
聚合是組合的一種較弱形式,或者説是關聯的一種較強形式。
相對於組合,聚合的目標端可以與多個源端建立關聯,即目標端是可以“共享”的。例如在下圖中,一本書(Book)可以有多名作為作者(author)的人(Person),而一個人(Person)也可能是多本書(Book)的作者(author)。

此外,組合的“整體“決定了”部分“的生命週期,而聚合不存在這種約束。當聚合的”整體“消失時,”部分“依舊存在,它並不隨”整體”而消失。例如當一本書(Book)被銷燬時(甚至所有已印刷的書都被銷燬時),作為這本書(Book)作者(author)的人(Person)依然健在;反之,當作為作者(author)的一個人(Person)死亡後,並不會影響這本書(Book)的完整性。
可以看到,聚合的語義與常規關聯的語義幾乎相同。當我們使用聚合時,通常可以直接使用關聯來替代它。如果需要強調類似部分的關係而它又不像組合那樣緊密與強烈時,則可以選擇使用聚合。
最後,特別補充一點,從UML技術角度來説,關聯有一個名為AggregationKind的屬性,普通關聯其值為None,對於組合其值為Composite,對於聚合,其值為Shared。

user avatar codejourney-blog Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.