大家都知道UML的類圖中一般包含五種關係即 關聯 彙總 組合 泛化 依賴 有些人可能會感覺組合跟彙總有點難區分 說難其實是相對其他幾種關係而言 實際上想分清這兩種關係一點也不難
彙總跟組合其實都屬於關聯 只不過它們是兩種特殊的關聯 因為本是同根生 所以它們之間難免會有相似之處 下面讓我們一起來看一下它們之間有何不同
彙總與組合的概念相信不用我在此贅述大家就已經瞭解了 下面直接上例子
程老師的《大話》裡舉大那個大雁的例子很貼切 在此我就借用一下 大雁喜歡熱鬧害怕孤獨 所以它們一直過著群居的生活 這樣就有了雁群 每一隻大雁都有自己的雁群 每個雁群都有好多大雁 大雁與雁群的這種關係就可以稱之為彙總 另外每隻大雁都有兩隻翅膀 大雁與雁翅的關係就叫做組合 有此可見 彙總的關係明顯沒有組合緊密 大雁不會因為它們的群主將雁群解散而無法生存 而雁翅就無法脫離大雁而單獨生存——組合關係的類具有相同的生命週期
彙總關係圖:
組合關係圖:
從從代碼上看這兩種關係的區別在於:
建構函式不同雁群類:
public class GooseGroup { public Goose goose; public GooseGroup(Goose goose) { this.goose = goose; } }
大雁類:
public class Goose { public Wings wings; public Goose() { wings=new Wings(); } }
彙總關係的類裡含有另一個類作為參數
雁群類(GooseGroup)的建構函式中要用到大雁(Goose)作為參數把值傳進來 大雁類(Goose)可以脫離雁群類而獨立存在
組合關係的類裡含有另一個類的執行個體化
大雁類(Goose)在執行個體化之前 一定要先執行個體化翅膀類(Wings) 兩個類緊密耦合在一起 它們有相同的生命週期 翅膀類(Wings)不可以脫離大雁類(Goose)而獨立存在
資訊的封裝性不同
在彙總關係中,用戶端可以同時瞭解雁群類和大雁類,因為他們都是獨立的
而在組合關係中,用戶端只認識大雁類,根本就不知道翅膀類的存在,因為翅膀類被嚴密的封裝在大雁類中。
以上內容部分出自望月聽濤部落格