合成/聚合複用原則的定義——儘量不要使用類繼承,而儘量使用合成/聚合。
合成/聚合都是關聯關係的特殊種類,聚合表示比較“弱”的擁有關係,具體表現是甲對象中可以包括乙對象,但乙對象不是甲對象的一部分;合成則是一種比較“強”的擁有關係,體現的是嚴格的整體與部分之間的關係,並且整體與部分擁有相同的生命週期,比如:魚和魚羣屬於聚合,手臂和身體屬於合成關係。
優先使用對象的合成/聚合有助於保持系統的每個類都有被封裝,並且類被擊中在單個任務上,這樣類和類之間的繼承層次就可以保持較小規模,並且不至於增長到不可控的巨大單位。
/**
* Author:小青
* Time:2017-8-27
* Function:臣子接口
*
*/
public interface Minister{
//臣子可以進行的操作
public void duty();
}
/**
* Author:小青
* Time:2017-8-27
* Function:士兵接口
*
*/
public interface Soldier{
//士兵可以進行的操作
public void duty();
}
/**
* Author:小青
* Time:2017-8-27
* Function:大將軍霍去病
*
*/
public class HuoQuBing implements Minister{
Soldier[] soldiers;
public HuoQuBing(Soldier[] soldiers){
super();
this.soldiers = soldiers;
}
public void setSoldier(Soldier[] soldiers){
this.soldiers = soldiers;
}
public Soldier[] getSoldier(){
return soldiers;
}
public void duty(){
System.out.println("將在外軍令有所不受");
}
}
/**
* Author:小青
* Time:2017-8-27
* Function:士兵甲
*
*/
public class SoldierA implements Soldier{
public void duty(){
System.out.println("兵鋒所向,擋者披靡");
}
}
/**
* Author:小青
* Time:2017-8-27
* Function:士兵乙
*
*/
public class SoldierB implements Soldier{
public void duty(){
System.out.println("犯我中華者,雖遠必誅");
}
}
/**
* Author:小青
* Time:2017-8-27
* Function:漢武帝
*
*/
public class Hanwudi{
Minister[] minister;
public Hanwudi(){}
publci Hanwudi(Minister[] minister){
this.minister = minister;
}
public void setMinister(Minister[] minister;){
this.minister = minister;
}
public Minister[] getMinister(){
return minister;
}
public void duty(){
System.out.println("普天之下,莫非王土,率土之濱,莫非王臣");
}
}
以上,在古代大將軍有強的影響力,對自己統領的將士保持有引用,便是聚合,而皇帝卻坐擁天下,包括大將軍,皇帝比大將軍擁有更強的擁有關係,更可以主宰大將軍的生死,這就相當於合成關係。
合成/聚合有如下優點:
- 新的對象存取子對象的唯一方法是通過子對象的接口
- 這種複用是黑箱複用,因爲子對象的內部細節是新對象不可見的
- 這種複用更好的支持封裝的特性
- 這種複用實現的相互依賴的比較小的
- 每一個新的類都可以講焦點集中在一個任務上。
- 這種複用可以在運行時動態地進行,新的對象可以動態地引用與子對象類型相同的對象
- 這種複用手段幾乎可以應用到任何環境中
複用原則的缺點就是系統中會有較多的對象需要管理。
以上內容,整理自劉徑舟,張玉華編著的《設計模式其實很簡單》讀書筆記,歡迎轉載.