聚合和組合只有概念上的區(qū)別,在Java中的代碼實(shí)現(xiàn)上沒有區(qū)別。
創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),達(dá)拉特網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:達(dá)拉特等地區(qū)。達(dá)拉特做網(wǎng)站價(jià)格咨詢:18980820575
聚合:指的是整體與部分的關(guān)系
組合:表示類之間整體和部分的關(guān)系,但是組合關(guān)系中部分和整體具有統(tǒng)一的生存期,即整體對(duì)象不存在,部分對(duì)象也將不存在
聚合(Aggregation)?關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強(qiáng)的關(guān)聯(lián)關(guān)系。聚合是整體和個(gè)體之間的關(guān)系。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關(guān)系便整體和個(gè)體的關(guān)系。與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實(shí)例變量實(shí)現(xiàn)的。但是關(guān)聯(lián)關(guān)系所涉及的兩個(gè)類是處在同一層次上的,而在聚合關(guān)系中,兩個(gè)類是處在不平等層次上的,一個(gè)代表整體,另一個(gè)代表部分。?
組合(Composition)?關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系強(qiáng)的關(guān)系。它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分對(duì)象的生命周期,組合關(guān)系是不能共享的。代表整體的對(duì)象需要負(fù)責(zé)保持部分對(duì)象和存活,在一些情況下將負(fù)責(zé)代表部分的對(duì)象湮滅掉。代表整體的對(duì)象可以將代表部分的對(duì)象傳遞給另一個(gè)對(duì)象,由后者負(fù)責(zé)此對(duì)象的生命周期。換言之,代表部分的對(duì)象在每一個(gè)時(shí)刻只能與一個(gè)對(duì)象發(fā)生組合關(guān)系,由后者排他地負(fù)責(zé)生命周期。部分和整體的生命周期一樣。
class?Driver?{???
//使用成員變量形式實(shí)現(xiàn)關(guān)聯(lián)???
Car?mycar;???
public?void?drive(){???
mycar.run();???
}???
...???
//使用方法參數(shù)形式實(shí)現(xiàn)關(guān)聯(lián)???
public?void?drive(Car?car){???
car.run();???
}???
}
聚合關(guān)系是是一種比較強(qiáng)的關(guān)聯(lián)關(guān)系,java中一般使用成員變量形式實(shí)現(xiàn)。對(duì)象之間存在著整體與部分的關(guān)系。例如上例中
class?Driver?{???
//使用成員變量形式實(shí)現(xiàn)聚合關(guān)系???
Car?mycar;???
public?void?drive(){???
mycar.run();???
}???
}
假如給上面代碼賦予如下語義:車是一輛私家車,是司機(jī)財(cái)產(chǎn)的一部分。則相同的代碼即表示聚合關(guān)系了。聚合關(guān)系一般使用setter方法給成員變量賦值。?
假如賦予如下語義:車是司機(jī)的必須有的財(cái)產(chǎn),要想成為一個(gè)司機(jī)必須要先有輛車,車要是沒了,司機(jī)也不想活了。而且司機(jī)要是不干司機(jī)了,這個(gè)車就砸了,別人誰也別想用。那就表示組合關(guān)系了。一般來說,為了表示組合關(guān)系,常常會(huì)使用構(gòu)造方法來達(dá)到初始化的目的,例如上例中,加上一個(gè)以Car為參數(shù)的構(gòu)造方法?
public?Driver(Car?car){???
mycar?=?car;???
}
所以,關(guān)聯(lián)、聚合、組合只能配合語義,結(jié)合上下文才能夠判斷出來,而只給出一段代碼讓我們判斷是關(guān)聯(lián),聚合,還是組合關(guān)系,則是無法判斷的。
組合:部分與整體是與生俱來的,部分的存在依賴于整體。比如人與人的某個(gè)器官,人一出生,器官就在,人死亡,器官也就沒了意義。
聚合:你與你的電腦(或者其它物品),電腦是屬于你的吧,但是你是一出生就擁有了電腦嗎,電腦是某個(gè)廠商生產(chǎn)出來的,然后你買過來才成為了你的一部分。你死了以后,電腦也可以送給別人繼續(xù)用?。∵@就不叫做其存亡了,所以這是聚合。
這個(gè)是結(jié)合我之前看過的設(shè)計(jì)模式所想到的,如果你了解過設(shè)計(jì)模式,則會(huì)更容易明白我說的是什么了,比如有一種設(shè)計(jì)模式叫做責(zé)任鏈模式,責(zé)任鏈中的處理者往往是先創(chuàng)建出來,然后再把引用傳到另一個(gè)責(zé)任處理對(duì)象作為責(zé)任接班人,這就用到了聚合的思想吧。
另外,《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)”。
意思是通過現(xiàn)在的類組合成一個(gè)新的類,叫做組合,如果這種組合是動(dòng)態(tài)的,則叫聚合。如何理解”動(dòng)態(tài)“,也就是可以隨時(shí)加進(jìn)來也可以隨時(shí)刪除,拿上面的人與電腦的例子來說,電腦可以隨時(shí)扔掉,也可以隨時(shí)加進(jìn)來,人的生命不會(huì)受到威脅,但是人如果少了某個(gè)器官,則會(huì)危及到生命了!其實(shí)現(xiàn)實(shí)中的例子與Java中的概念還是有一點(diǎn)出入,類比只能是接近真相。