首頁  >  文章  >  Java  >  Java中依賴、關聯、聚合、組合四者之間的差異詳解

Java中依賴、關聯、聚合、組合四者之間的差異詳解

黄舟
黄舟原創
2017-08-10 13:48:471451瀏覽

這篇文章主要介紹了Java依賴-關聯-聚合-組合之間區別理解,依賴關係比較好區分,它是耦合度最弱的一種,下文給大家介紹的非常詳細,感興趣的朋友一起看看吧

首先看一看書上對這四種關係的定義:

  • 依賴(Dependency)關係是類別與類別之間的聯結。依賴關係表示一個類別依賴另一個類別的定義。例如,一個人(Person)可以買車(car)和房子(House),Person類別依賴Car類別和House類別的定義,因為Person類別引用了Car和House。與關聯不同的是,Person類別裡並沒有Car和House類型的屬性,Car和House的實例是以參量的方式傳入到buy()方法中去的。一般而言,依賴關係在Java語言中體現為局域變數、方法的形參,或是對靜態方法的呼叫。

  • 關聯(Association)關係是類別與類別之間的聯接,它使一個類別知道另一個類別的屬性和方法。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關係一般使用成員變數來實作。

  •  聚合(Aggregation) 關係是關聯關係的一種,是強的關聯關係。聚合是整體和個體之間的關係。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關係便整體和個體的關係。與關聯關係一樣,聚合關係也是透過實例變數實現的。但是關聯關係所涉及的兩個類別是處在同一層次上的,而在聚合關係中,兩個類別是處在不平等層次上的,一個代表整體,另一個代表部分。

  •  組合(Composition) 關係是關聯關係的一種,是比聚合關係強的關係。它要求普通的聚合關係中代表整體的物件負責代表部分物件的生命週期,組合關係是不能共享的。代表整體的對象需要負責維持部分對象和存活,在某些情況下將負責代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另一個對象,由後者負責此對象的生命週期。換言之,代表部分的物件在每一個時刻只能與一個物件發生組合關係,由後者排他地負責生命週期。部分和整體的生命週期一樣。

-摘自《Java物件導向程式設計》

       以上關係的耦合依序增強(關於耦合度的概念將在以後具體討論,這裡可以暫時理解為當一個類別發生變更時,對其他類別造成的影響程度,影響越小則耦合度越弱,影響越大耦合度越強)。由定義我們已經知道,依賴關係其實是一種比較弱的關聯,聚合是一種比較強的關聯,而組合則是一種更強的關聯,所以籠統的來區分的話,實際上這四種關係、都是關聯關係。

        依賴關係較好區分,它是耦合度最弱的一種,在java中表現為區域變數、方法的形參,或是對靜態方法的調用,如下面的例子:Driver類依賴Car類,Driver的三個方法分別演示了依賴關係的三種不同形式。


class Car { 
  public static void run(){ 
    System.out.println("汽车在奔跑"); 
  } 
} 
class Driver { 
  //使用形参方式发生依赖关系 
  public void drive1(Car car){ 
    car.run(); 
  } 
  //使用局部变量发生依赖关系 
  public void drive2(){ 
    Car car = new Car(); 
    car.run(); 
  } 
  //使用静态变量发生依赖关系 
  public void drive3(){ 
    Car.run(); 
  } 
}

        關聯關係在java中一般使用成員變數來實現,有時也以方法形參的形式實現。依然使用Driver和Car的例子,使用方法參數形式可以表示依賴關係,也可以表示關聯關係,畢竟我們無法在程式中太準確的表達語意。在這個例子中,使用成員變數表達這個意思:車是我自己的車,我「擁有」這個車。使用方法參數表達:車子不是我的,我只是個司機,別人給我什麼車我就開什麼車,我使用這個車。


class Driver { 
  //使用成员变量形式实现关联 
  Car mycar; 
  public void drive(){ 
    mycar.run(); 
  } 
  ... 
  //使用方法参数形式实现关联 
  public void drive(Car car){ 
    car.run(); 
  } 
}

        聚合關係是一種較強的關聯關係,在java中一般使用成員變數形式實作。對象之間存在著整體與部分的關係。例如上例中


class Driver { 
  //使用成员变量形式实现聚合关系 
  Car mycar; 
  public void drive(){ 
    mycar.run(); 
  } 
}

        假如給上面程式碼賦予以下語意:車是一輛私家車,是駕駛財產的一部份。則相同的程式碼即表示聚合關係了。聚合關係一般使用setter方法為成員變數賦值。

假如賦予以下語意:車是司機的必須有的財產,要成為一個司機必須先有輛車,車要是沒了,司機也不想活了。而且司機要是不幹司機了,這輛車就砸了,別人誰也別想用。那就表示組合關係了。一般來說,為了表示組合關係,常常會使用構造方法來達到初始化的目的,例如上例中,加上一個以Car為參數的建構方法


public Driver(Car car){ 
  mycar = car; 
}

        所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

以上是Java中依賴、關聯、聚合、組合四者之間的差異詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn