1. 程式人生 > >聚合與組合關系 文章出處:http://blog.csdn.net/liushuijinger/article/details/6994265

聚合與組合關系 文章出處:http://blog.csdn.net/liushuijinger/article/details/6994265

聚合 兩個 keyword 之間 strong view sta 部分 uml

大家都知道UML的類圖中一般包含五種關系即 關聯 聚合 組合 泛化 依賴 有些人可能會感覺組合跟聚合有點難區分 說難其實是相對其他幾種關系而言 實際上想分清這兩種關系一點也不難

聚合跟組合其實都屬於關聯 只不過它們是兩種特殊的關聯 因為本是同根生 所以它們之間難免會有相似之處 下面讓我們一起來看一下它們之間有何不同

聚合與組合的概念相信不用我在此贅述大家就已經了解了 下面直接上例子

程老師的《大話》裏舉大那個大雁的例子很貼切 在此我就借用一下 大雁喜歡熱鬧害怕孤獨 所以它們一直過著群居的生活 這樣就有了雁群 每一只大雁都有自己的雁群 每個雁群都有好多大雁 大雁與雁群的這種關系就可以稱之為聚合 另外每只大雁都有兩只翅膀 大雁與雁翅的關系就叫做組合 有此可見 聚合的關系明顯沒有組合緊密 大雁不會因為它們的群主將雁群解散而無法生存 而雁翅就無法脫離大雁而單獨生存——組合關系的類具有相同的生命周期

聚合關系圖:

技術分享

組合關系圖:

技術分享

從從代碼上看這兩種關系的區別在於:

構造函數不同 雁群類: [csharp] view plain copy
  1. public class GooseGroup
  2. {
  3. public Goose goose;
  4. public GooseGroup(Goose goose)
  5. {
  6. this.goose = goose;
  7. }
  8. }
大雁類: [csharp] view plain copy
  1. public class Goose
  2. {
  3. public Wings wings;
  4. public Goose()
  5. {
  6. wings=new Wings();
  7. }
  8. }




聚合關系的類裏含有另一個類作為參數

雁群類(GooseGroup)的構造函數中要用到大雁(Goose)作為參數把值傳進來 大雁類(Goose)可以脫離雁群類而獨立存在

組合關系的類裏含有另一個類的實例化

大雁類(Goose)在實例化之前 一定要先實例化翅膀類(Wings) 兩個類緊密耦合在一起 它們有相同的生命周期 翅膀類(Wings)不可以脫離大雁類(Goose)而獨立存在

信息的封裝性不同

在聚合關系中,客戶端可以同時了解雁群類和大雁類,因為他們都是獨立的

而在組合關系中,客戶端只認識大雁類,根本就不知道翅膀類的存在,因為翅膀類被嚴密的封裝在大雁類中。

以上內容部分出自望月聽濤博客

聚合與組合關系 文章出處:http://blog.csdn.net/liushuijinger/article/details/6994265