UML類別圖:Aggregation vs. Composition
Composition
|
圖一. Composition範例。左邊:類別圖 右邊:原始碼
|
在真實世界中,我們喜歡DIY將許多簡單零件組裝成更複雜機器,而且每一零件都缺一不可,因為零件的缺失會造成機器無法運作。這樣過程我們稱為『Composition』, 而這兩者關係的動詞關鍵字是『Owns a (擁有)』。圖一所舉的例子是電腦,一台電腦就必須有一顆CPU,而且CPU壞掉就會造成電腦無法運作,以下列出它的特性:
- class Laptop own a class CPU_I7
- 類別負責產生和消滅附屬的類別
- 變數與擁有者生命週期相同
- 當物件Laptop被消滅,CPU也被消滅
如下圖所示,CPU_I7被Laptop控制生命週期,有趣的是它們建構和解構的順序彼此相反。這是因為建構時會放入堆疊,而解構時會從推疊頂端拿出資料,因此解構順序會與建構順序完全相反。
|
圖二. Composition執行結果。上圖:執行Demo程式瑪 下圖:輸出
|
Aggregation
|
圖三. Aggregation範例。左邊:類別圖 右邊:原始碼
|
在C++中,當類別的資料成員含有指標物件變數,代表兩類別之間關係是『Aggregation』,並且它的關鍵字是『
has a (有)』。這種是一種比較弱的關係,兩物件的生命週期各自獨立,也就是說物件並不負責另一個的產生和刪除。例如:當搭乘計程車時,司機在乎車子裡有多少乘客,他是否要尋找客人,然而他無法自動化產生乘客,而且乘客不會因計程車銷毀而消失,下面以圖三為例總結它的特性:
- class Car has a class Passenger
- 類別並不負責新增或消滅附屬的類別
- 指標變數自己的生命週期(lifecycle)
- 當物件Car被消滅時,物件Passenger仍然存在
如圖四所示,我在物件Car範圍外新增物件Passenger後,再將它的記憶體位址放入物件Car向量容器裡,然後程式結束時刪除物件Car,物件Passenger仍然存在,然而這樣情況會造成memory leak。因此,使用Aggregation要小心,程式結束前要
記得刪除指標變數。
|
圖四. Aggregation執行結果。上圖:執行Demo程式瑪 下圖:輸出 |