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