UML類別圖:Aggregation vs. Composition

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


圖三. Aggregation範例。左邊:類別圖 右邊:原始碼


在C++中,當類別的資料成員含有指標物件變數,代表兩類別之間關係是『Aggregation』,並且它的關鍵字是『has a ()』。這種是一種比較弱的關係,兩物件的生命週期各自獨立,也就是說物件並不負責另一個的產生和刪除。例如:當搭乘計程車時,司機在乎車子裡有多少乘客,他是否要尋找客人,然而他無法自動化產生乘客,而且乘客不會因計程車銷毀而消失,下面以圖三為例總結它的特性:
  • class Car has a class Passenger
    • 車子裡面多少乘客
    • 車子可以沒有乘客
  • 類別並不負責新增或消滅附屬的類別
    • 指標變數自己的生命週期(lifecycle)
    • 當物件Car被消滅時,物件Passenger仍然存在

如圖四所示,我在物件Car範圍外新增物件Passenger後,再將它的記憶體位址放入物件Car向量容器裡,然後程式結束時刪除物件Car,物件Passenger仍然存在,然而這樣情況會造成memory leak。因此,使用Aggregation要小心,程式結束前要記得刪除指標變數
圖四. Aggregation執行結果。上圖:執行Demo程式瑪 下圖:輸出

留言

這個網誌中的熱門文章

VirtualBox教學:重設硬碟(.vdi)大小(上)

VirtualBox教學:重設硬碟(.vdi)大小(下)

VirtualBox教學: 新增Windows7虛擬電腦(下)