設計模式-結構型-組合模式

来源:https://www.cnblogs.com/az4215/archive/2019/09/29/11602936.html
-Advertisement-
Play Games

組合模式(Composite): 定義: 組合模式又叫部分整體模式,它是一種將對象組合成樹狀的層次結構模式,用來表示"部分-整體"的關係,使用戶對單個對象和組合對象具有一致的訪問性。 組合模式的角色: 1)抽象構建(Component):它的主要作用是為樹葉構件和樹枝構件聲明公共介面,並實現它們的默 ...


組合模式(Composite):

定義:

  組合模式又叫部分整體模式,它是一種將對象組合成樹狀的層次結構模式,用來表示"部分-整體"的關係,使用戶對單個對象和組合對象具有一致的訪問性。

組合模式的角色:

  1)抽象構建(Component):它的主要作用是為樹葉構件和樹枝構件聲明公共介面,並實現它們的預設行為。在透明式的組合模式中抽象構件還聲明訪問和管理子類的介面;在安全式的組合模式中不聲明訪問和管理子類的介面,管理工作由樹枝構件完成。

  2)樹葉構件(Leaf):是組合中的葉節點對象,它沒有子節點,用於實現抽象構件角色中 聲明的公共介面。

  3)樹枝構件(Composite):是組合中的分支節點對象,它有子節點。它實現了抽象構件角色中聲明的介面,它的主要作用是存儲和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

  

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         // Create a tree structure
 6         Composite root = new Composite("root");
 7         root.Add(new Leaf("Leaf A"));
 8         root.Add(new Leaf("Leaf B"));
 9 
10         Composite comp = new Composite("Composite X");
11         comp.Add(new Leaf("Leaf XA"));
12         comp.Add(new Leaf("Leaf XB"));
13 
14         root.Add(comp);
15         root.Add(new Leaf("Leaf C"));
16 
17         // Add and remove a leaf
18         Leaf leaf = new Leaf("Leaf D");
19         root.Add(leaf);
20         root.Remove(leaf);
21 
22         // Recursively display tree
23         root.Display(1);
24     }
25 }
26 
27 public abstract class Component
28 {
29     protected string _name;
30 
31     public Component(string name)
32     {
33         this._name = name;
34     }
35 
36     public abstract void Add(Component c);
37 
38     public abstract void Remove(Component c);
39 
40     public abstract void Display(int depth);
41 }
42 
43 public class Leaf : Component
44 {
45     public Leaf(string name)
46         : base(name)
47     {
48     }
49 
50     public override void Add(Component c)
51     {
52         Console.WriteLine("Cannot add to a leaf");
53     }
54 
55     public override void Remove(Component c)
56     {
57         Console.WriteLine("Cannot remove from a leaf");
58     }
59 
60     public override void Display(int depth)
61     {
62         Console.WriteLine(new String('-', depth) + _name);
63     }
64 }
65 
66 public class Composite : Component
67 {
68     private List<Component> _children = new List<Component>();
69 
70     public Composite(string name)
71         : base(name)
72     {
73     }
74 
75     public override void Add(Component component)
76     {
77         _children.Add(component);
78     }
79 
80     public override void Remove(Component component)
81     {
82         _children.Remove(component);
83     }
84 
85     public override void Display(int depth)
86     {
87         Console.WriteLine(new String('-', depth) + _name);
88 
89         foreach (Component component in _children)
90         {
91             component.Display(depth + 2);
92         }
93     }
94 }

 極簡版如下,將顯示部分可以拿到客戶端進行:

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         // Create a tree structure
 6         Component root = new Component("root");
 7         root.Add(new Component("Leaf A"));
 8         root.Add(new Component("Leaf B"));
 9 
10         Component comp = new Component("Composite X");
11         comp.Add(new Component("Leaf XA"));
12         comp.Add(new Component("Leaf XB"));
13 
14         root.Add(comp);
15         root.Add(new Component("Leaf C"));
16 
17         // Add and remove a leaf
18         Component leaf = new Component("Leaf D");
19         root.Add(leaf);
20         root.Remove(leaf);
21 
22         // 由客戶端顯示,Component只進行組合
23     }
24 }
25 
26 public class Component
27 {
28     protected string _name;
29     private List<Component> _children = new List<Component>();
30 
31     public Component(string name)
32     {
33         this._name = name;
34     }
35 
36     public void Add(Component c)
37     {
38         _children.Add(c);
39     }
40 
41     public void Remove(Component c)
42     {
43         _children.Remove(c);
44     }
45 
46     public List<Component> GetChild()
47     {
48         return _children;
49     }
50 }

是不是恍然大悟,就是我們在做許可權管理的時候用到的一對多的關係。

組合模式的優缺點:

  優點:

    1)組合模式使得客戶端代碼可以一致地處理單個對象和組合對象,無須關心自己處理的單個對象還是組合對象,這簡化了客戶端代碼;

    2)更容易在組合體內加入新的對象,客戶端不會因為加入新的對象而更改源代碼,滿足OCP原則。

  缺點:

    1)設計較複雜,客戶端需要花更多的時間理清類之間的層次關係;

    2)不容易限制容器中的構件;

    3)不容易用繼承的方法來增加構件的新功能。

參考:https://www.cnblogs.com/libingql/p/3496345.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、聲明:@keyframes name{ }; 2、涉及到的屬性 animation-name:動畫名稱 animation-duration:單次動畫總時長 animation-timing-function:時間函數 animation-delay:播放前延時的時長 animation-ite ...
  • 前言 The last time, I have learned 【THE LAST TIME】一直是我想寫的一個系列,旨在厚積薄發,重溫前端。 也是給自己的查缺補漏和技術分享。 歡迎大家多多評論指點吐槽。 系列文章均首發於公眾號【全棧前端精選】,筆者文章集合詳見 "Nealyang/persona ...
  • <script> 標簽 在 HTML 中,JavaScript 代碼必須位於 <script> 與 </script> 標簽之間。 實例 註釋:舊的 JavaScript 例子也許會使用 type 屬性:<script type="text/javascript">。 註釋:type 屬性不是必需的 ...
  • 場景 Docker 私服Registry簡介與使用Docker-Compose安裝Registry: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/101567542 在上面安裝Registry後配置其客戶端以及Web UI。 註 ...
  •   AppBoxFuture的存儲引擎依賴Raft一致性協議來保證各個分區副本的一致性,如果不處理Raft日誌將不斷增長,因此需要特定的機制(定期或每處理一定數量的日誌)來回收那些無用的日誌數據。通過學習Raft協議內的Log Compaction,並參考TiKV等實現,作者初步 ...
  • 單例模式(singleton):是JAVA中最簡單的一種設計模式,屬於創建型模式。所謂單例,就是整個程式有且僅有一個實例。 特點: 構造方法私有化 在本類中實例化一個對象作為本類的屬性 對外提供一個訪問本類對象的方法 餓漢式:類載入時就載入對象 應用場景:小對象,頻繁用,高併發 特點:線程安全,比較 ...
  • 一 會話跟蹤 我們需要先瞭解一下什麼是會話!可以把會話理解為客戶端與伺服器之間的一次會晤,在一次會晤中可能會包含多次請求和響應。例如你給10086打個電話,你就是客戶端,而10086服務人員就是伺服器了。從雙方接通電話那一刻起,會話就開始了,到某一方掛斷電話表示會話結束。在通話過程中,你會向1008 ...
  • 1.面向對象的思想優點 優點: 簡化代碼 ,構建公共模板 ,擴展性強 思想: 類作為模板 ,對象通過模板實例化對象 ,對象去做事 ,抽象將顯示存在的事物使用代碼體現 2.三大特性 封裝(狹義) : 對屬性的封裝 ,對方法的封裝 繼承 1.子類擁有父類除私有內容外所有 2.對象通過子類-父類-...找 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...