合成複用原則,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.