合成/聚合複用原則

合成/聚合複用原則的定義——儘量不要使用類繼承,而儘量使用合成/聚合。

合成/聚合都是關聯關係的特殊種類,聚合表示比較“弱”的擁有關係,具體表現是甲對象中可以包括乙對象,但乙對象不是甲對象的一部分;合成則是一種比較“強”的擁有關係,體現的是嚴格的整體與部分之間的關係,並且整體與部分擁有相同的生命週期,比如:魚和魚羣屬於聚合,手臂和身體屬於合成關係。

優先使用對象的合成/聚合有助於保持系統的每個類都有被封裝,並且類被擊中在單個任務上,這樣類和類之間的繼承層次就可以保持較小規模,並且不至於增長到不可控的巨大單位。

/**
  * 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("普天之下,莫非王土,率土之濱,莫非王臣");
	}
}
以上,在古代大將軍有強的影響力,對自己統領的將士保持有引用,便是聚合,而皇帝卻坐擁天下,包括大將軍,皇帝比大將軍擁有更強的擁有關係,更可以主宰大將軍的生死,這就相當於合成關係。

合成/聚合有如下優點:

  • 新的對象存取子對象的唯一方法是通過子對象的接口
  • 這種複用是黑箱複用,因爲子對象的內部細節是新對象不可見的
  • 這種複用更好的支持封裝的特性
  • 這種複用實現的相互依賴的比較小的
  • 每一個新的類都可以講焦點集中在一個任務上。
  • 這種複用可以在運行時動態地進行,新的對象可以動態地引用與子對象類型相同的對象
  • 這種複用手段幾乎可以應用到任何環境中

複用原則的缺點就是系統中會有較多的對象需要管理。

以上內容,整理自劉徑舟,張玉華編著的《設計模式其實很簡單》讀書筆記,歡迎轉載.

發佈了38 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章