組合模式(Composite Pattern)(一):組合模式介紹


一、意圖


將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite模式使得用戶對單個對象和組合對象的使用具有一致性。



二、適用性


• 你想表示對象的部分-整體層次結構。
• 你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。



三、組成


——抽象構件角色(Component):為組合中的對象聲明接口, 在適當的情況下,也可實現所有類共有接口的缺省行為。

——樹葉構件角色(Leaf):在組合中表示葉節點對象沒有子節點,實現抽象構件角色聲明的接口。

——樹枝構件角色(Composite):在組合中表示分支節點對象,有子節點,實現抽象構件角色聲明的接口;存儲子部件。



四、兩種實現方式


——透明式的組合模式:將管理子構件的方法定義在Component接口中,這樣Leaf類就需要處理這些對其意義不大的方法(空實現或拋異常),在接口層次上Leaf和Composite沒有區別,即透明性。Component 聲明的些管理子構件的方法對於Leaf來說是不適用的這樣也就帶來了一些安全性問題。


——安全式的組合模式:將管理子構件的方法定義在Composite中,這樣編譯時任何從Leaf 中增加或刪除對象的嘗試都將被發現,但是由於Leaf和Composite有不同的接口(方法),又失去了透明性。



五、結構





六、簡單實現



將管理子構件的方法定義在Composite中,即安全式的組合模式


1.Component

public interface Component
{
	public void doSomething();
}

2.Leaf

public class Leaf implements Component
{

	@Override
	public void doSomething()
	{
      System.out.println("Leaf doSomething");
	}

}

3.Composite

public class Composite implements Component
{
	List<Component> childs = new ArrayList<Component>();

	public void add(Component child)
	{
		this.childs.add(child);
	}

	public void remove(Component child)
	{
		this.childs.remove(child);
	}

	public Component getChild(int i)
	{
		return this.childs.get(i);
	}

	@Override
	public void doSomething()
	{
		for (Component child : childs)
			child.doSomething();
	}

}

4.Client

public class Client
{
	public static void main(String[] args)
	{
		/**
		 *           composite1
		 *           /      \
		 *        leaf1   composite2
		 *                  /   \
		 *               leaf2  leaf3        
		 *               
		 * */
		Component leaf1=new Leaf();
		Component leaf2=new Leaf();
		Component leaf3=new Leaf();
		Composite composite1=new Composite();
		Composite composite2=new Composite();
		
		composite2.add(leaf2);
		composite2.add(leaf3);
		composite1.add(leaf1);
		composite1.add(composite2);
		
		composite1.doSomething();
		
	}

}


七、其他


1.組合模式讓我們能用樹形方式創建對象的結構,樹里面包含了Composite以及Leaf的對象。使用組合結構,我們能把相同的操作應用在Composite和Leaf上,即大多數情況下,我們可以忽略Composite和Leaf之間的差別,以相同的方式使用它們。為了保持透明性,Leaf和Composite都要繼承或實現Component。


2.讓管理子構件的方法如add()、remove()、getChild()等出現在Leaf中,是因為我們可以將Leaf看作是沒有子構件的節點。


3.《設計模式》一書認為:在組合模式中,相對於安全性,我們比較強調透明性。對於透明式的組合模式中的Leaf內不需要的方法可以使用空處理或者異常報告的方式來解決。


4.Component中可以有一個指向父親的指針,以便在游走時更容易。比如刪除樹形結構中的某個樹或葉節點(即Composite或Leaf)時會更加方便。



轉載請注明出處:http://blog.csdn.net/jialinqiang/article/details/8946607


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: