EA&UML日拱一卒--類圖::關聯(關聯,聚合,組合)

說完了關聯,就必須說一下聚合(Aggregation)和組合(Composition)。這三者的區別,很多人並不是很清楚。在實際的設計中也經常可以看到亂用的情況。希望本文能夠解決這個問題。

聚合(Aggreation)

聚合是一種特殊形式的關聯,而不是一個獨立的概念。簡單的說判斷一個關聯是否是聚合,有兩個條件:

  1. 是否可以看作是部分和整體的關係。

2. 是否存在某些操作和屬性可以從整體傳播到部分。

第一點很好理解,估計不會產生什麼誤解;第二點包含兩層意思,一是整體和部分之間存在共同的操作和屬性,二是屬性的變化和操作可以從整體到部分傳播。

下圖是一個簡單的圖形編輯軟體的例子。

在這個例子中,存在一個基類Shape,它有兩個屬性,分別是m_positon,和m_size;還有兩個方法,分別是MoveTo和SetSize。

另外存在四個派生類,Rectange,Triangle,Eclipse是簡單圖形,Selection用來管理用戶選中的圖形。

當用戶同時選中多個圖形時,我們就得到一個選中圖形的集合Selection。這時侯,

  1. Selection可以看作是整體,每個圖形可以看作是部分。

  2. 用戶對Selection進行的移動,調整大小的操作都會傳播到各個圖形。

所以我們說各圖形和Selection之間是聚合關係。類似的,我們可以判定:

  1. 員工和公司的關係不是聚合。

  2. 鍵盤/滑鼠/顯示器和電腦的關係是聚合。

組合(Compsosition)

組合是一種特殊的聚合,它和聚合的區別就是部分被整體獨佔,和整體有著相同的生命周期。

還用上面的例子,這個軟體可以將幾個圖形合併成一個複合圖形,然後就當作一個圖形來使用。這時候被合併的小圖形就被複合圖形獨佔,與複合圖形有同樣的生命周期。類圖如下。

這時候,我們說構成複合圖形的每個圖形和複合圖形之間的關係就是組合關係。

聚合/組合的設定方法

EA是通過關聯端屬性設定畫面來修改組合/聚合選項的。畫面如下圖:

紅框中的Aggregation項目有三個選項:

  1. none:普通的關聯

  2. share:聚合

  3. composite:組合

關聯/聚合/組合的關係歸納起來就是下面這張圖:

如果閱讀本文能給您帶來些許收穫,歡迎分享給更多的朋友!

閱讀更多新文章,請關注【面向對象思考】微信公眾號!

推薦閱讀:

Python 面向對象(進階篇)
EA&UML日拱一卒--活動圖::活動(續)
EA&UML日拱一卒--類圖::枚舉類型(enumeration)
大話設計模式之簡單工廠模式與策略模式
EA&UML日拱一卒--活動圖::活動

TAG:面向對象編程 | 面向對象分析與設計 | UML建模 |