天天看點

P6:合成複用原則(CRP)

合成複用原則,Composite Reuse Principle,簡稱CRP.

一、定義

在一個新的對象裡面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達到複用已有功能的目的。簡單來說就是:盡量使用合成/聚合,盡量不要使用繼承。

1、合成:

合成表示一種強的擁有關系,同生同滅。比如: 一個人新出生的人,人有兩個胳膊,胳膊和人就是部分和整體的關系。人去世了,那麼胳膊也就沒用了,也就是說胳膊和人的生命周期是相同的。

class People {
	  //類似這種結構屬于合成關系
      Hand hand = new Hand();
      Foot foot = new Foot();
}
           

2、聚合:

聚合表示“擁有”關系或者整體與部分的關系,是一種弱擁有的包含關系。比如,一個人擁有鞋子和帽子,人與鞋子、帽子就屬于聚合關系。

class People {
	  //類似這種結構屬于聚合關系,通過構造器從外界傳入聚合的元素,這個元素可以存在,也可以為null;
      Shoes shoe;
      Hat hat;
	public Person(Shoes shoe,Hat hat){      
        this.shoe = shoe;
        this.hat = hat;        
    }
}
           

二、兩類合成模式的差別:

實作合成主要可以通過繼承和合成/聚合兩類手段,由于繼承的使用存在以下缺點:

1.打破了封裝性,子類依賴于超類的實作細節,和超類高度耦合;
	2.超類更新後可能會導緻錯誤,維護成本很高。
           

基于這個原因,一般建議使用合成/聚合來實作組成。

END.