其實,對於聚合和組合,如果換成英文,就很好理解了:聚合就是“has-a”,組合就是“contains-a”。
聚合是空心的菱形;組合是實心的菱形(這個比較好理解,實心的肯定比空心的扎實)。
摘錄一段話:
聚合和組合的區別在於:聚合關系是“has-a”關系,組合關系是“contains-a”關系;聚合關系表示整體與部分的關系比較弱,而組合比較強;聚合關系中代表部分事物的對象與代表聚合事物的對象的生存期無關,一旦刪除了聚合對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了代表部分事物的對象。
我們用淺顯的例子來說明聚合和組合的區別。“國破家亡”,國滅了,家自然也沒有了,“國”和“家”顯然也是組合關系。而相反的,計算機和它的外設之間就是聚合關系,因為它們之間的關系相對松散,計算機沒了,外設還可以獨立存在,還可以接在別的計算機上。在聚合關系中,部分可以獨立於聚合而存在,部分的所有權也可以由幾個聚合來共享,比如打印機就可以在辦公室內被廣大同事共用。
組合和聚合是有很大區別的,這個區別不是在形式上,而是在本質上:
比如A類中包含B類的一個引用b,當A類的一個對象消亡時,b這個引用所指向的對象也同時消亡(沒有任何一個引用指向它,成了垃圾對象),這種情況叫做組合,反之b所指向的對象還會有另外的引用指向它,這種情況叫聚合。
在實際寫代碼時組合方式一般會這樣寫:
A類的構造方法里創建B類的對象,也就是說,當A類的一個對象產生時,B類的對象隨之產生,當 A類的這個對象消亡時,它所包含的B類的對象也隨之消亡。
聚合方式則是這樣:
A類的對象在創建時不會立即創建B類的對象,而是等待一個外界的對象傳給它
傳給它的這個對象不是A類創建的。
