C# 設計模式-組合模式
阿新 • • 發佈:2021-01-21
一.介紹
組合模式(Composite Pattern)。屬於結構型模式。將物件組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。
二.實現
舉個例子,我們寫前端有用上html標籤(抽象構件),這個標籤分為雙標籤(樹枝構件)和單標籤(樹葉構件),在寫html時,雙標籤可以包括雙標籤和單標籤,單標籤不能包括任何標籤。無論寫什麼標籤,都是寫html。這種情況就可以使用組合模式來實現。
//抽象構件(Component)角色 //html標籤 public abstract class Component { public virtualstring Name { get; set; } public virtual string Name2 { get; set; } public abstract void Add(Component child); public abstract void Remove(Component child); public abstract void Display(int depth = 0); } //樹葉構件(Leaf)角色 //單標籤 public class Leaf : Component { public override void Add(Component child) {throw new NotImplementedException(); } public override void Display(int depth = 0) { Console.WriteLine(new String('-', depth * 2) + Name); } public override void Remove(Component child) { throw new NotImplementedException(); } } //樹枝構件(Composite)角色 //雙標籤 publicclass Composite : Component { private List<Component> children = new List<Component>(); public override void Add(Component child) { if (child != null) children.Add(child); } public override void Display(int depth = 0) { Console.WriteLine(new String('-', depth * 2) + Name); children.ForEach(c => { c.Display(depth + 1); }); Console.WriteLine(new String('-', depth * 2) + Name2); } public override void Remove(Component child) { if (child != null) children.Remove(child); } } //呼叫 public static void Main(string[] args) { //定義html標籤 Component html = new Composite { Name = "<html>", Name2 = "</html>" }; //header標籤及裡面的標籤 var header = new Composite { Name = "<header>", Name2 = "</header>" }; header.Add(new Leaf { Name = "<img id='logo' />" }); header.Add(new Leaf { Name = "<input id='B' />" }); //div標籤及裡面的標籤 var content = new Composite { Name = "<div>", Name2 = "</div>" }; var banner = new Composite { Name = "<div id='banner'>", Name2 = "</div>" }; banner.Add(new Leaf { Name = "<img />" }); content.Add(banner); //footer標籤 var footer = new Composite { Name = "<footer>", Name2 = "</footer>" }; //html標籤包括的標籤 html.Add(header); html.Add(content); html.Add(footer); //輸出 html.Display(1); }
輸出內容。
三.總結
優點:
1.組合模式使得客戶端可以一致地處理物件和物件容器,無需關係處理的單個物件,還是組合的物件容器。
2.將“客戶程式碼與複雜的物件容器結構”解耦。
3.可以更容易地往組合物件中加入新的構件。
缺點:
1.使得設計更加複雜。客戶端需要花更多時間去理解物件之間的層級關係。