1. 程式人生 > >java物件間的關係(依賴,關聯,組合,聚合)

java物件間的關係(依賴,關聯,組合,聚合)

組合,聚合,關聯,依賴 的區別

依賴與關聯

依賴(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() ;
   
  }
 }

聚合和組合的區別:聚合是個體離開了整體,依然可以存在.
                                       組合是個體和整體不可以分開,個體不能離開整體單獨存在.


依賴,關聯 和聚合,組合的區別:依賴,關聯 : 類之間的關係是在同一層次上.
                                                               聚合,組合: 類之間的關係表現為整體和部分.