聚合與組合的意義和區別 (Java)


繼承是面向對象編程三大特性之一,通過繼承,子類可以繼承父類非private的屬性和方法,大大提高代碼復用性和開發效率。

但繼承也有眾多缺點,

  • 比如使得子類與父類過度耦合,當父類發生調整會影響所有子類都進行檢查,必要時也要同時進行調整
  • 子類對父類同時也具有了侵入性,需要重載所有父類的屬性和方法,這和迪米特法則是違背的
  • 同時子類由於需要繼承父類所有屬性和方法,這時候子類就會顯得笨拙,例如圓形三角形和矩形都可以繼承父類圖形類,但如果給圖形類增加了長和寬或者半徑的屬性,那三角形圓形矩形則繼承了無用的屬性,此時應調整繼承方式僅限方法,不具有一般性的屬性不要放到父類中

在面對這些缺點時,里氏替換原則提出了使用聚合或組合的方式來減少繼承的使用。


 

聚合是耦合度相對組合偏低的依賴關系,兩者生命周期可以不同,可以理解為A類與B類存在緊密關系,但並非不可或缺。就像人一定需要身份證,但可能處於身份證丟失補辦狀態。

  • 實現方式在A類中私有化B類對象,通過set方法賦值,然后通過該私有化對象實現B類中的方法

public class A{

  private B b;

  public void setB(B b){

    this.b = b;

  }

}


 

組合是耦合度更高的關聯關系,兩者會具有相同的生命周期,可以理解為A類與B類存在同聲同滅的關系,就像人一定要有心臟,沒有心臟就肯定活不了。。。實現方式

  • 可以在A類構造器中將B類作為參數,

public class A{

  public A(B b){}

}

  • 或者餓漢式加載B對象

public class A{

  private B b = new B();

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM