我們來講一下組合模式: 怎麼是組合模式呢?組合模式,將對象組合成樹形結構以表示‘部分-整體’的層次結構,組合模式是的用戶對單個對象和組合對象的用用具有一致性。 與一個很簡單的例子,公司的組織架構,大都是樹枝結構的。下麵,我們來看一下如何用組合模式寫樹枝結構。 客戶端 結果: 好,是不是很簡單啊…… ...
我們來講一下組合模式:
怎麼是組合模式呢?組合模式,將對象組合成樹形結構以表示‘部分-整體’的層次結構,組合模式是的用戶對單個對象和組合對象的用用具有一致性。
與一個很簡單的例子,公司的組織架構,大都是樹枝結構的。下麵,我們來看一下如何用組合模式寫樹枝結構。
1 //介面用於訪問和管理Component的子部件 2 abstract class Component 3 { 4 5 protected string name; 6 7 public Component(string name) 8 { 9 this.name = name; 10 } 11 12 //通常都用Add 和Remove 方法來提供增加或移除樹葉或樹枝的功能 13 public abstract void Add(Component c); 14 public abstract void Remove(Component c); 15 public abstract void Display(int depth); 16 }
1 //Leaf在組合中表示葉節點對象,葉節點沒有子節點 2 class Leaf:Component 3 { 4 public Leaf(string name) : base(name) 5 { 6 } 7 //由於葉子沒有再增加分支和樹葉,所以Add 和Remove 方法實現它沒有意義,但這樣做可以消除葉節點和枝節點 8 //在抽象層次的區別,它們具備完全一直的介面 9 public override void Add(Component c) 10 { 11 Console.WriteLine("Can't add to a leaf"); 12 } 13 14 public override void Remove(Component c) 15 { 16 Console.WriteLine("Can't remove from a leaf"); 17 } 18 19 public override void Display(int depth) 20 { 21 Console.WriteLine(new String('-',depth)+name); 22 } 23 }
1 //Composite定義有枝節點行為,用來儲存子部件,在Component介面中實現與子部件有關的操作 2 //比如增加Add 和 刪除 Remove 3 class Composite:Component 4 { 5 //一個子對象集合用來存儲其下屬的枝節點和葉節點 6 private List<Component> children = new List<Component>(); 7 public Composite(string name) : base(name) 8 { 9 } 10 11 public override void Add(Component c) 12 { 13 children.Add(c); 14 } 15 16 public override void Remove(Component c) 17 { 18 children.Remove(c); 19 } 20 21 public override void Display(int depth) 22 { 23 //顯示其枝節點名稱,並對其下級進行遍歷 24 Console.WriteLine(new String('-',depth)+name); 25 foreach (Component component in children) 26 { 27 component.Display(depth + 2); 28 } 29 } 30 }
客戶端
public static void Main() { //生成樹根root,根上長出兩葉LeafA 和 LeafB Composite root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); //根上長出分支CompositX //分支上也有兩葉LeafXA和LeafXB Composite comp = new Composite("Composite X"); comp.Add(new Leaf("Leaf XA")); comp.Add(new Leaf("Leaf XB")); root.Add(comp); //在Composite X 上在長出分支 Composite XY //分支上也有兩葉LeafXYA 和 LeafXYB Composite comp2 = new Composite("Composite XY"); comp2.Add(new Leaf("Leaf XYA")); comp2.Add(new Leaf("Leaf XYB")); comp.Add(comp2); root.Add(new Leaf("Leaf C")); Leaf leaf = new Leaf("Leaf D"); root.Add(leaf); root.Remove(leaf); root.Display(1); Console.ReadKey(); }
結果:
好,是不是很簡單啊……
那麼,什麼時候用組合模式呢?當你發現需求中是體現部分與整體層次的結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一地使用組合結構中的所有對象時,就應該考慮用組合模式了。
組合模式就先講到這裡,下一篇博文,我們講 迭代器模式
本系列將持續更新,喜歡的小伙伴可以點一下關註和推薦,謝謝大家的支持