天天看點

設計模式之組合模式組合模式

組合模式

組合模式(Composite Pattern),又叫整體部分模式,它建立了對象組的樹形結構,将對象組合成樹狀結構以表示“整體-部分”的層次關系。

組合模式依據樹形結構來組合對象,用來表示部分以及整體層次,組合模式使得使用者對單個對象群組合對象通路具有一緻性,即:組合能夠讓客戶以一緻的方式處理個别對象以及組合對象。這種設計模式屬于結構型模式。

組合模式的三個角色

  • 抽象構件(Component)角色:這是組合中對象聲明接口, 在适當情況下, 實作所有類共有的接口預設行為,用于通路和管理 Component 子部件, Component 可以是抽象類或者接口。
  • 葉子構件(Leaf)角色:在組合中表示葉子節點,葉子節點沒有子節點。
  • 樹枝構件(Composite)角色:非葉子節點, 用于存儲子部件, 在 Component 接口中實作 子部件的相關操作,比如增加(add), 删除。
設計模式之組合模式組合模式

源代碼

抽象構件:Component

public abstract class Component {
	//個體和整體都具有
	public void operation(){
		//編寫業務邏輯
	}
	//增加一個葉子構件或樹枝構件
	public abstract void add(Component component);
	//删除一個葉子構件或樹枝構件
	public abstract void remove(Component component);
	//獲得分支下的所有葉子構件和樹枝構件
	public abstract List<Component> getChildren();
}

           

樹枝構件:Composite

public class Composite extends Component {
	//構件容器
	private ArrayList<Component> componentArrayList = new ArrayList<Component>();
	//增加一個葉子構件或樹枝構件
	public void add(Component component){
		this.componentArrayList.add(component);
	}
	//删除一個葉子構件或樹枝構件
	public void remove(Component component){
		this.componentArrayList.remove(component);
	}
	//獲得分支下的所有葉子構件和樹枝構件
	public List<Component> getChildren(){
		return this.componentArrayList;
	}
}

           

葉子構件:Leaf

public class Leaf extends Component {

	public void add(Component component){
		//空實作
	}

	public void remove(Component component){
		//空實作
	}

	public List<Component> getChildren(){
		//空實作
	}
}

           

Client

public class Client {

	public static void main(String[] args) {
		//建立一個根節點
		Composite root = new Composite();
		root.operation();
		//建立一個樹枝構件
		Composite branch = new Composite();
		//建立一個葉子節點
		Leaf leaf = new Leaf();
		//建立整體
		root.add(branch);
		branch.add(leaf);
	}

	//通過遞歸周遊樹
	public static void showTree(Component root){
		for(Component c:root.getChildren()){
			if(c instanceof Leaf){ //葉子節點
				c.operation();
			}else{ //樹枝節點
				showTree(c);
			}
		}
	}
}

           

組合模式的注意事項和細節

  1. 簡化用戶端操作。用戶端隻需要面對一緻的對象而不用考慮整體部分或者節點葉子的問題。
  2. 具有較強的擴充性。當我們要更改組合對象時,我們隻需要調整内部的層次關系,用戶端不用做出任何改動.
  3. 友善建立出複雜的層次結構。用戶端不用理會組合裡面的組成細節,容易添加節點或者葉子進而建立出複雜的 樹形結構
  4. 需要周遊組織機構,或者處理的對象具有樹形結構時, 非常适合使用組合模式.
  5. 要求較高的抽象性,如果節點和葉子有很多差異性的話,比如很多方法和屬性都不一樣,不适合使用組合模式

參考資料:

設計模式系列之「組合模式」

設計模式 | 組合模式及典型應用

設計模式之組合模式

尚矽谷 Java 設計模式課程筆記。