關(guān)聯(lián)--依賴(lài)、組合--聚合 聯(lián)系與區(qū)別:
依賴(lài)是比關(guān)聯(lián)弱的關(guān)系,關(guān)聯(lián)代表一種結(jié)構(gòu)化的關(guān)系,體現(xiàn)在生成的代碼中,以java為例:
若類(lèi)A單向關(guān)聯(lián)指向類(lèi)B,則在類(lèi)A中存在一個(gè)屬性B b。
若類(lèi)A依賴(lài)類(lèi)B,則不會(huì)有這個(gè)屬性,類(lèi)B的實(shí)例可能存在于某個(gè)方法調(diào)用的參數(shù)中,或某個(gè)方法的局部變量中。
例如代碼:
依賴(lài):----存在于某個(gè)方法調(diào)用的參數(shù)中,或某個(gè)方法的局部變量中。
Person類(lèi)與Screwdriver類(lèi)的依賴(lài)關(guān)系
[代碼表現(xiàn)]
public class Person{
/** 擰螺絲 */
public void screw(Screwdriver screwdriver){
screwdriver.screw();
}
}
關(guān)聯(lián):---存在一個(gè)屬性
公司(Company)和員工(Employee)的關(guān)聯(lián)關(guān)系
[代碼表現(xiàn)]
public class Company{
private Employee employee;
public Employee getEmployee(){
return employee;
}
public void setEmployee(Employee employee){
this.employee=employee;
}
//公司運(yùn)作
public void run(){
employee.startWorking();
}
}
聚合: 空心菱形加實(shí)線(xiàn)箭頭表示
表示C9聚合C10,但是C10可以離開(kāi)C9而獨(dú)立存在(獨(dú)立存在的意思是在某個(gè)應(yīng)用的問(wèn)題域中這個(gè)類(lèi)的存在有意義。這句話(huà)怎么解,請(qǐng)看下面組合里的解釋?zhuān)?br />
同構(gòu)性,主體和部分不具有生命期的一致性
課程組可由多個(gè)學(xué)生組成,課程組撤消了,學(xué)生還活得好好的,這是聚合。
組合(也有人稱(chēng)為包容):一般是實(shí)心菱形加實(shí)線(xiàn)箭頭表示
異構(gòu)性,部分和主體具有生命期上的一致性
表示的是C8被C7包容,而且C8不能離開(kāi)C7而獨(dú)立存在。但這是視問(wèn)題域而定的,例如在關(guān)心汽車(chē)的領(lǐng)域里,輪胎是一定要組合在汽車(chē)類(lèi)中的,因?yàn)樗x開(kāi)了汽車(chē)就沒(méi)有意義了。但是在賣(mài)輪胎的店鋪業(yè)務(wù)里,就算輪胎離開(kāi)了汽車(chē),它也是有意義的,這就可以用聚合了。在《敏捷開(kāi)發(fā)》中還說(shuō)到,A組合B,則A需要知道B的生存周期,即可能A負(fù)責(zé)生成或者釋放B,或者A通過(guò)某種途徑知道B的生成和釋放。
組合的例子:你顯示屏上的瀏覽器窗口,關(guān)閉瀏覽器,上面的按紐死掉不見(jiàn)了,這是組合(再打開(kāi)一個(gè)瀏覽窗口,按紐已經(jīng)不是原來(lái)的了)。