聚合和組合的區(qū)別?
作者:訪客發(fā)布時間:2021-07-17分類:聚合物瀏覽:115
聚合(Aggregation)?關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強的關(guān)聯(lián)關(guān)系。聚合是整體和個體之間的關(guān)系。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關(guān)系便整體和個體的關(guān)系。與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實例變量實現(xiàn)的。但是關(guān)聯(lián)關(guān)系所涉及的兩個類是處在同一層次上的,而在聚合關(guān)系中,兩個類是處在不平等層次上的,一個代表整體,另一個代表部分
組合(Composition)?關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系強的關(guān)系。它要求普通的聚合關(guān)系中代表整體的對象負責(zé)代表部分對象的生命周期,組合關(guān)系是不能共享的。代表整體的對象需要負責(zé)保持部分對象和存活,在一些情況下將負責(zé)代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另一個對象,由后者負責(zé)此對象的生命周期。換言之,代表部分的對象在每一個時刻只能與一個對象發(fā)生組合關(guān)系,由后者排他地負責(zé)生命周期。部分和整體的生命周期一樣。
以上關(guān)系的耦合度依次增強(關(guān)于耦合度的概念將在以后具體討論,這里可以暫時理解為當(dāng)一個類發(fā)生變更時,對其他類造成的影響程度,影響越小則耦合度越弱,影響越大耦合度越強)。由定義我們已經(jīng)知道,依賴關(guān)系實際上是一種比較弱的關(guān)聯(lián),聚合是一種比較強的關(guān)聯(lián),而組合則是一種更強的關(guān)聯(lián),所以籠統(tǒng)的來區(qū)分的話,實際上這四種關(guān)系、都是關(guān)聯(lián)關(guān)系。?聚合關(guān)系是是一種比較強的關(guān)聯(lián)關(guān)系,java中一般使用成員變量形式實現(xiàn)。對象之間存在著整體與部分的關(guān)系。例如上例中?
class?Driver?{???????//使用成員變量形式實現(xiàn)聚合關(guān)系???????Car?mycar;???????public?void?drive(){???????????mycar.run();???????}???}假如給上面代碼賦予如下語義:車是一輛私家車,是司機財產(chǎn)的一部分。則相同的代碼即表示聚合關(guān)系了。聚合關(guān)系一般使用setter方法給成員變量賦值。?假如賦予如下語義:車是司機的必須有的財產(chǎn),要想成為一個司機必須要先有輛車,車要是沒了,司機也不想活了。而且司機要是不干司機了,這個車就砸了,別人誰也別想用。那就表示組合關(guān)系了。一般來說,為了表示組合關(guān)系,常常會使用構(gòu)造方法來達到初始化的目的,例如上例中,加上一個以Car為參數(shù)的構(gòu)造方法?
public?Driver(Car?car){???????mycar?=?car;???}所以,關(guān)聯(lián)、聚合、組合只能配合語義,結(jié)合上下文才能夠判斷出來,而只給出一段代碼讓我們判斷是關(guān)聯(lián),聚合,還是組合關(guān)系,則是無法判斷的。
組合和聚合是有很大區(qū)別的,這個區(qū)別不是在形式上,而是在本質(zhì)上:比如A類中包含B類的一個引用b,當(dāng)A類的一個對象消亡時,b這個引用所指向的對象也同時消亡(沒有任何一個引用指向它,成了垃圾對象),這種情況叫做組合,反之b所指向的對象還會有另外的引用指向它,這種情況叫聚合。在實際寫代碼時組合方式一般會這樣寫: A類的構(gòu)造方法里創(chuàng)建B類的對象,也就是說,當(dāng)A類的一個對象產(chǎn)生時,B類的對象隨之產(chǎn)生,當(dāng)A類的這個對象消亡時,它所包含的B類的對象也隨之消亡。聚合方式則是這樣: A類的對象在創(chuàng)建時不會立即創(chuàng)建B類的對象,而是等待一個外界的對象傳給它傳給它的這個對象不是A類創(chuàng)建的。現(xiàn)實生活中:人和人和手,腳是組合關(guān)系,因為當(dāng)人死亡后人的手也就不復(fù)存在了。人和他的電腦是聚合關(guān)系。 class Hand{ } class Computer{ } 組合: class Person{ private Hand hand; public Person(){ hand = new Hand(); } } 聚合: class Person{ private Computer computer; public setComputer(){ computer = new Computer(); } }
- 上一篇:鷓鴣常用的飼料有哪些種類?
- 下一篇:濰坊潤豐造紙助劑有限公司介紹?
- 聚合物排行
- 最近發(fā)表