說明:
數個物件之間,呈現一種樹狀結構。物件之間可以組合。
範例:
一個線上購物商城,有A、B兩品牌,都有手機、筆電兩種商品。要產生商品選單。
希望達成如下的效果
static void Main(string[] args) { CompositeMenu cm = new CompositeMenu("分類"); CompositeMenu cm_A = new CompositeMenu("A品牌"); cm_A.Add(new LeafMenuPhone("Android")); cm_A.Add(new LeafMenuNB("14吋")); cm_A.Add(new LeafMenuNB("15吋")); cm.Add(cm_A); CompositeMenu cm_B = new CompositeMenu("B品牌"); cm_B.Add(new LeafMenuPhone("Android")); cm_B.Add(new LeafMenuNB("13吋")); cm_B.Add(new LeafMenuNB("14吋")); cm.Add(cm_B); CompositeMenu cm_sale = new CompositeMenu("特價區"); CompositeMenu cm_A2 = new CompositeMenu("A品牌"); LeafMenuNB leaf_nb_14 = new LeafMenuNB("超值14吋"); LeafMenuNB leaf_nb_15 = new LeafMenuNB("超值15吋"); cm_A2.Add(leaf_nb_14); // 新增超值14吋 cm_A2.Add(leaf_nb_15); // 新增超值15吋 cm_A2.Remove(leaf_nb_15); // 移除超值15吋 cm_sale.Add(cm_A2); cm.Add(cm_sale); cm.Print(0); Console.Read(); }執行結果:
分類 -A品牌 --Android手機 --14吋筆電 --15吋筆電 -B品牌 --Android手機 --13吋筆電 --14吋筆電 -特價區 --A品牌 ---超值14吋筆電
實現重點在於,節點能夠連接另一個節點或葉。
其餘程式碼
// 選單元件抽像介面 abstract class MenuComponent { protected string name; public MenuComponent(string name) { this.name = name; } // 顯示資料 public abstract void Print(int depth); } // 節點選單 class CompositeMenu : MenuComponent { private List<MenuComponent> menu = new List<MenuComponent>(); public CompositeMenu(string name) : base(name) { } // 新增 public void Add(MenuComponent m) { menu.Add(m); } // 移除 public void Remove(MenuComponent m) { menu.Remove(m); } public override void Print(int depth) { Console.WriteLine(new String('-', depth) + this.name); foreach (MenuComponent m in menu) { m.Print(depth + 1); } } } // 葉(手機) class LeafMenuPhone : MenuComponent { public LeafMenuPhone(string name) : base(name) { } public override void Print(int depth) { Console.WriteLine(new String('-', depth) + name + "手機"); } } // 葉(筆電) class LeafMenuNB : MenuComponent { public LeafMenuNB(string name) : base(name) { } public override void Print(int depth) { Console.WriteLine(new String('-', depth) + name + "筆電"); } }
相關連結:設計模式整理列表
沒有留言:
張貼留言