前言
點選檢視:設計模式系列
組合模式(Composite)
定義:將物件組合成樹形結構,表示層次結構關係,並且讓物件能夠以同樣的方式呈現給客戶端程式。
舉例:
家族譜的編寫:
男性:可傳宗接代,也有權利把一些人剔除族譜。
女性:記錄到家譜中,但不能傳宗接代。
理解:每一個小家庭中,爸爸媽媽和我,都是爸爸做主,可踢出我跟媽媽中的任何一個,也可增加任何一個。元件模式中的元件可以是單獨一個物件組成,也可以是多個元件組成(一個家庭,甚至一個家庭的多級延續);
類圖:
族員共性程式碼:
//// <summary> /// //族人 抽象出來的族人共性 /// </summary> public abstract class Father { //族人的姓名 protected string name = string.Empty; public string Name { get { return name; } } //增加後代 public abstract void Add(Father boy); //逐出家譜 public abstract void Remove(Father boy); //定義所有族人,做個簡介 public abstract void Intro(); }
家族成員程式碼
//男性後代 public class Boy : Father { //建構函式 public Boy() { } public Boy(string Name) { this.name = Name; } List<Father> myFamily = new List<Father>(); //自我簡介 public override void Intro() { Console.WriteLine("我是:{0};", Name); foreach (Father f in myFamily) { f.Intro(); } } //增加後代 public override void Add(Father boy) { myFamily.Add(boy); } //逐出家譜 public override void Remove(Father boy) { myFamily.Remove(boy); } } //女性後代 public class Gril : Father { //建構函式 public Gril() { } public Gril(string Name) { this.name = Name; } //自我簡介 public override void Intro() { Console.WriteLine("我是:{0};", Name); } //不能新增 public override void Add(Father store) { throw new NotImplementedException(); } //不能刪除 public override void Remove(Father store) { throw new NotImplementedException(); } }
客戶端程式碼:
public static void Main() { //爺爺取老婆 Boy yeye = new Boy("爺爺"); Gril nainai = new Gril("奶奶"); yeye.Add(nainai); //爺爺要孩子 Boy baba = new Boy("爸爸"); Gril gugu = new Gril("姑姑"); yeye.Add(gugu); yeye.Add(baba); //爸爸要我 Boy me = new Boy("me"); baba.Add(me); //我要孩子 Boy son = new Boy("son"); me.Add(son); //爺爺的大家庭,族譜做介紹 yeye.Intro(); Console.Read(); }
組合模式總結
有組合模式的案例可知:客戶端程式碼,很容易組建層次結構,並且層次分明,同時又很容易遍歷所有的元件集合。但要注意理解組合模式中的節點與頁,節點可刪可加,頁則不能增刪。
大家都好好理解,消化下這個模式,想想都那裡,那種情況下能使這個模式的特性發揮的淋漓盡職。
歡迎加入部落格左上方群,交流探討,設計模式,資料庫,c#.net,資料結構。