java物件間的關係(依賴,關聯,組合,聚合)
阿新 • • 發佈:2019-01-01
組合,聚合,關聯,依賴 的區別
依賴與關聯依賴(Dependency ) :
含義:是類與類之間的連線,表示一個類依賴於另外一個類的定義;依賴關係僅僅描述了類與類之間的一種使用與被使用的關係;
體現:在Java和C++中體現為區域性變數、方法/函式的引數或者是對靜態方法的呼叫;
舉例:人依賴於水和空氣;汽車依賴汽油;
UML圖表示的依賴關係:
依賴:
比如說我要過河,沒有橋怎麼辦,我就去借來一條小船渡過去。我與小船的關係僅僅是使用(借用)的關係。
表現在程式碼上,為依賴的類的某個方法以被依賴的類作為其引數。或者是class A 的某個方法創造了 class B 的例項抑或對class B的靜態方法的呼叫。如果A依賴於B,那意味著B的變化可能要求A也發生變化;
static class Boat{ public static void row(){ System.out.println("開動"); } } class Person{ public void crossRiver(Boat boat){ boat.row() ; } public void fishing(){ Boat boat = new Boat() ; boat.row() ; } public void patrol(){ Boat.row() ; } }
關聯(Association):
含義:類與類之間的連結,關聯關係使一個類知道另外一個類的屬性和方法;通常含有“知道”,“瞭解”的含義。關聯可以是雙向的,也可以是單向的
體現:在Java和C++中,關聯關係是通過成員變數來實現的;
舉例:“漁民”需要知道“天氣”情況才能夠出海
UML圖表示的關聯關係:
關聯:
有名的例子:客戶和訂單的關係以及公司和員工的關係,都是關聯關係。還有就是我和我的單車的例子,他們都是一種“擁有”的關係。表現在程式碼上,就是一個類包含另一個類的例項,通常表現為被關聯類以類屬性的形式出現在關聯類的類定義中,也可以表現為關聯類引用了一個型別為被關聯類的全域性變數。關聯可以使單向的,也可以使雙向的。
class Computer{
public void develop(){
System.out.println("Develop ");
}
}
class Person{
private Computer computer ;
public Person(Computer computer){
this.computer = computer ;
}
public void work(){
computer.develop() ;
System.out.println("work");
}
}
依賴和關聯的區別在於依賴是使用,關聯是擁有.
-------------------------------------------------------------------------------------------------------------
聚合(aggregation):
含義:是關聯關係的一種,是一種強關聯關係(has-a);聚合關係是整體和個體/部分之間的關係;關聯關係的兩個類處於同一個層次上,而聚合關係的兩個類處於不同的層次上,一個是整體,一個是個體/部分;在聚合關係中,代表個體/部分的物件有可能會被多個代表整體的物件所共享;
體現:C++中,聚合關係通過將被聚合者的(陣列)指標作為內部成員來實現的;
圖示:空心菱形 + 實線 + 箭頭;箭頭指向被聚合的類,也就是說,箭頭指向個體/部分;
舉例:班級和學生,當班級刪除之後,學生還是存在,學生還可能被培訓機構引用
UML圖表示的聚合關係:
class Classes{
private Student student ;
public Classes(Student student){
this.student = student ;
}
}
class Student{
}
組合(Composition):
含義:它也是關聯關係的一種(is-a),但它是比聚合關係更強的關係.組合關係要求聚合關係中代表整體的物件要負責代表個體/部分的物件的整個生命週期;組合關係不能共享;在組合關係中,如果代表整體的物件被銷燬或破壞,那麼代表個體/部分的物件也一定會被銷燬或破壞,而聚在合關係中,代表個體/部分的物件則有可能被多個代表整體的物件所共享,而不一定會隨著某個代表整體的物件被銷燬或破壞而被銷燬或破壞;
體現:在Java和C++中,組合關係是通過成員變數來實現的;
圖示:實心菱形 + 實線 + 箭頭;箭頭指向代表個體/部分的物件,也就是被合成/組合的類的物件;舉例:一個人由頭、四肢、等各種器官組成,因為人與這些器官具有相同的生命週期,人死了,這些器官也掛了;房子和房間的關係,當房子沒有了,房間同樣不可能單獨存在。
UML圖表示的組合關係:class Room{
public Room createRoom(){
System.out.println("建立房間");
return new Room() ;
}
}
class House{
private Room room ;
public House(){
room = new Room() ;
}
public void createHouse(){
room.createRoom() ;
}
}
聚合和組合的區別:聚合是個體離開了整體,依然可以存在.
組合是個體和整體不可以分開,個體不能離開整體單獨存在.
依賴,關聯 和聚合,組合的區別:依賴,關聯 : 類之間的關係是在同一層次上.
聚合,組合: 類之間的關係表現為整體和部分.