組合:部分與整體是與生俱來的,部分的存在依賴於整體。比如人與人的某個器官,人一出生,器官就在,人死亡,器官也就沒了意義。
關系相對緊密
A類的生命期受B類的控制
開辟新空間
聚合:你與你的電腦(或者其它物品),電腦是屬於你的吧,但是你是一出生就擁有了電腦嗎,電腦是某個廠商生產出來的,然后你買過來才成為了你的一部分。你死了以后,電腦也可以送給別人繼續用啊!這就不叫做其存亡了,所以這是聚合。
關系相對松散
聚合類B不需要對被聚合類A負責
沒有新開辟空間
聚合類B的對象在創建時不會立即創建被聚合類A的對象
而是等待一個外界的對象傳給它,傳給它的這個對象不是B類創建的
這個是結合我之前看過的設計模式所想到的,如果你了解過設計模式,則會更容易明白我說的是什么了,比如有一種設計模式叫做責任鏈模式,責任鏈中的處理者往往是先創建出來,然后再把引用傳到另一個責任處理對象作為責任接班人,這就用到了聚合的思想吧。
另外,《thinking in Java》里面是這樣說的,“composing a new class from existing classes, this concept is called composition (if the composition happens dynamically, it's usually called aggregation)”。
意思是通過現在的類組合成一個新的類,叫做組合,如果這種組合是動態的,則叫聚合。如何理解”動態“,也就是可以隨時加進來也可以隨時刪除,拿上面的人與電腦的例子來說,電腦可以隨時扔掉,也可以隨時加進來,人的生命不會受到威脅,但是人如果少了某個器官,則會危及到生命了!其實現實中的例子與Java中的概念還是有一點出入,類比只能是接近真相。
組合和聚合是有很大區別的,這個區別不是在形式上,而是在本質上: 比如A類中包含B類的一個引用b,當A類的一個對象消亡時,b這個引用所指向的對象也同時消亡(沒有任何一個引用指向它,成了垃圾對象),這種情況叫做組合,反之b所指向的對象還會有另外的引用指向它,這種情況叫聚合。 在實際寫代碼時組合方式一般會這樣寫: A類的構造方法里創建B類的對象,也就是說,當A類的一個對象產生時,B類的對象隨之產生,當A類的這個對象消亡時,它所包含的B類的對象也隨之消亡。 聚合方式則是這樣: A類的對象在創建時不會立即創建B類的對象,而是等待一個外界的對象傳給它 傳給它的這個對象不是A類創建的。 現實生活中: 人和手,腳是組合關系,因為當人死亡后人的手也就不復存在了。人和他的電腦是聚合關系。
1 class Hand{ 2 } 3 class Computer{ 4 } 5 //組合: 6 class Person{ 7 private Hand hand; 8 public Person(){ 9 hand = new Hand(); 10 } 11 } 12 //聚合: 13 class Person{ 14 private Computer computer; 15 public setComputer(){ 16 computer = new Computer(); 17 } 18 }
轉自:https://www.cnblogs.com/TaoLeonis/p/7126340.html