聚合(Aggregation)?關系是關聯關系的壹種,是強的關聯關系。聚合是整體和個體之間的關系。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關系便整體和個體的關系。與關聯關系壹樣,聚合關系也是通過實例變量實現的。但是關聯關系所涉及的兩個類是處在同壹層次上的,而在聚合關系中,兩個類是處在不平等層次上的,壹個代表整體,另壹個代表部分
組合(Composition)?關系是關聯關系的壹種,是比聚合關系強的關系。它要求普通的聚合關系中代表整體的對象負責代表部分對象的生命周期,組合關系是不能***享的。代表整體的對象需要負責保持部分對象和存活,在壹些情況下將負責代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另壹個對象,由後者負責此對象的生命周期。換言之,代表部分的對象在每壹個時刻只能與壹個對象發生組合關系,由後者排他地負責生命周期。部分和整體的生命周期壹樣。
以上關系的耦合度依次增強(關於耦合度的概念將在以後具體討論,這裏可以暫時理解為當壹個類發生變更時,對其他類造成的影響程度,影響越小則耦合度越弱,影響越大耦合度越強)。由定義我們已經知道,依賴關系實際上是壹種比較弱的關聯,聚合是壹種比較強的關聯,而組合則是壹種更強的關聯,所以籠統的來區分的話,實際上這四種關系、都是關聯關系。?
聚合關系是是壹種比較強的關聯關系,java中壹般使用成員變量形式實現。對象之間存在著整體與部分的關系。例如上例中?
class?Driver?{//使用成員變量形式實現聚合關系
Car?mycar;
public?void?drive(){
mycar.run();
}
}假如給上面代碼賦予如下語義:車是壹輛私家車,是司機財產的壹部分。則相同的代碼即表示聚合關系了。聚合關系壹般使用setter方法給成員變量賦值。?
假如賦予如下語義:車是司機的必須有的財產,要想成為壹個司機必須要先有輛車,車要是沒了,司機也不想活了。而且司機要是不幹司機了,這個車就砸了,別人誰也別想用。那就表示組合關系了。壹般來說,為了表示組合關系,常常會使用構造方法來達到初始化的目的,例如上例中,加上壹個以Car為參數的構造方法?public?Driver(Car?car){
mycar?=?car;
}所以,關聯、聚合、組合只能配合語義,結合上下文才能夠判斷出來,而只給出壹段代碼讓我們判斷是關聯,聚合,還是組合關系,則是無法判斷的。