亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C# 設(shè)計(jì)模式系列教程-組合模式

 更新時(shí)間:2016年06月01日 11:01:11   作者:Wang Juqiang  
組合模式可以使客戶端調(diào)用簡(jiǎn)單,它可以一致使用組合結(jié)構(gòu)或是其中單個(gè)對(duì)象,簡(jiǎn)化了客戶端代碼。

1. 概述

  將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

2. 解決的問(wèn)題

  當(dāng)希望忽略單個(gè)對(duì)象和組合對(duì)象的區(qū)別,統(tǒng)一使用組合結(jié)構(gòu)中的所有對(duì)象(將這種“統(tǒng)一”性封裝起來(lái))。

3. 組合模式中的角色

  3.1 組合部件(Component):它是一個(gè)抽象角色,為要組合的對(duì)象提供統(tǒng)一的接口。

  3.2 葉子(Leaf):在組合中表示子節(jié)點(diǎn)對(duì)象,葉子節(jié)點(diǎn)不能有子節(jié)點(diǎn)。

  3.3 合成部件(Composite):定義有枝節(jié)點(diǎn)的行為,用來(lái)存儲(chǔ)部件,實(shí)現(xiàn)在Component接口中的有關(guān)操作,如增加(Add)和刪除(Remove)。

4. 模式解讀

  4.1 組合模式的類(lèi)圖

http://img.jbzj.com/file_images/article/201606/2016060111022323.png

  4.2 組合模式的實(shí)現(xiàn)代碼

  /// <summary>
  /// 一個(gè)抽象構(gòu)件,聲明一個(gè)接口用于訪問(wèn)和管理Component的子部件
  /// </summary>
  public abstract class Component
  {
    protected string name;

    public Component(string name)
    {
      this.name = name;
    }

    /// <summary>
    /// 增加一個(gè)節(jié)點(diǎn)
    /// </summary>
    /// <param name="component"></param>
    public abstract void Add(Component component);

    /// <summary>
    /// 移除一個(gè)節(jié)點(diǎn)
    /// </summary>
    /// <param name="component"></param>
    public abstract void Remove(Component component);

    /// <summary>
    /// 顯示層級(jí)結(jié)構(gòu)
    /// </summary>
    public abstract void Display(int level);
  }

  /// <summary>
  /// 葉子節(jié)點(diǎn)
  /// </summary>
  public class Leaf : Component
  {
    public Leaf(string name)
      : base(name)
    { }

    /// <summary>
    /// 由于葉子節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn),所以Add和Remove方法對(duì)它來(lái)說(shuō)沒(méi)有意義,但它繼承自Component,這樣做可以消除葉節(jié)點(diǎn)和枝節(jié)點(diǎn)對(duì)象在抽象層次的區(qū)別,它們具備完全一致的接口。
    /// </summary>
    /// <param name="component"></param>
    public override void Add(Component component)
    {
      Console.WriteLine("Can not add a component to a leaf.");
    }

    /// <summary>
    /// 實(shí)現(xiàn)它沒(méi)有意義,只是提供了一個(gè)一致的調(diào)用接口
    /// </summary>
    /// <param name="component"></param>
    public override void Remove(Component component)
    {
      Console.WriteLine("Can not remove a component to a leaf.");
    }

    public override void Display(int level)
    {
      Console.WriteLine(new string('-',level) + name);
    }
  }

  /// <summary>
  /// 定義有枝節(jié)點(diǎn)的行為,用來(lái)存儲(chǔ)部件,實(shí)現(xiàn)在Component接口中對(duì)子部件有關(guān)的操作
  /// </summary>
  public class Composite : Component
  {
    public Composite(string name)
      : base(name)
    { }

    /// <summary>
    /// 一個(gè)子對(duì)象集合,用來(lái)存儲(chǔ)其下屬的枝節(jié)點(diǎn)和葉節(jié)點(diǎn)
    /// </summary>
    private List<Component> children = new List<Component>();

    /// <summary>
    /// 增加子節(jié)點(diǎn)
    /// </summary>
    /// <param name="component"></param>
    public override void Add(Component component)
    {
      children.Add(component);
    }

    /// <summary>
    /// 移除子節(jié)點(diǎn)
    /// </summary>
    /// <param name="component"></param>
    public override void Remove(Component component)
    {
      children.Remove(component);
    }

    public override void Display(int level)
    {
      Console.WriteLine(new string('-', level) + name);

      // 遍歷其子節(jié)點(diǎn)并顯示
      foreach (Component component in children)
      {
        component.Display(level+2);
      }
    }
  }

  4.3 客戶端代碼

  class Program
  {
    static void Main(string[] args)
    {
      // 生成樹(shù)根,并為其增加兩個(gè)葉子節(jié)點(diǎn)
      Component root = new Composite("Root");
      root.Add(new Leaf("Leaf A in Root"));
      root.Add(new Leaf("Leaf B in Root"));

      // 為根增加兩個(gè)枝節(jié)點(diǎn)
      Component branchX = new Composite("Branch X in Root");
      Component branchY = new Composite("Branch Y in Root");
      root.Add(branchX);
      root.Add(branchY);

      // 為BranchX增加頁(yè)節(jié)點(diǎn)
      branchX.Add(new Leaf("Leaf A in Branch X"));

      // 為BranchX增加枝節(jié)點(diǎn)
      Component branchZ = new Composite("Branch Z in Branch X");
      branchX.Add(branchZ);

      // 為BranchY增加葉節(jié)點(diǎn)
      branchY.Add(new Leaf("Leaf in Branch Y"));

      // 為BranchZ增加葉節(jié)點(diǎn)
      branchZ.Add(new Leaf("Leaf in Branch Z"));

      // 顯示樹(shù)
      root.Display(1);

      Console.Read();
    }
  }

  運(yùn)行結(jié)果

http://img.jbzj.com/file_images/article/201606/2016060111022324.png

5. 透明方式與安全方式

  5.1 透明方式:在Component中聲明所有來(lái)管理子對(duì)象的方法,其中包括Add,Remove等。這樣實(shí)現(xiàn)Component接口的所有子類(lèi)都具備了Add和Remove方法。這樣做的好處是葉節(jié)點(diǎn)和枝節(jié)點(diǎn)對(duì)于外界沒(méi)有區(qū)別,它們具備完全一致的接口。

  5.2 安全方式:在Component中不去聲明Add和Remove方法,那么子類(lèi)的Leaf就不需要實(shí)現(xiàn)它,而是在Composit聲明所有用來(lái)管理子類(lèi)對(duì)象的方法。

  5.3 兩種方式有缺點(diǎn):對(duì)于透明方式,客戶端對(duì)葉節(jié)點(diǎn)和枝節(jié)點(diǎn)是一致的,但葉節(jié)點(diǎn)并不具備Add和Remove的功能,因而對(duì)它們的實(shí)現(xiàn)是沒(méi)有意義的;對(duì)于安全方式,葉節(jié)點(diǎn)無(wú)需在實(shí)現(xiàn)Add與Remove這樣的方法,但是對(duì)于客戶端來(lái)說(shuō),必須對(duì)葉節(jié)點(diǎn)和枝節(jié)點(diǎn)進(jìn)行判定,為客戶端的使用帶來(lái)不便。

6. 模式總結(jié)

  6.1 優(yōu)點(diǎn)

    6.1.1 使客戶端調(diào)用簡(jiǎn)單,它可以一致使用組合結(jié)構(gòu)或是其中單個(gè)對(duì)象,簡(jiǎn)化了客戶端代碼。

    6.1.2 容易在組合體內(nèi)增加對(duì)象部件??蛻舳瞬槐匾蚣尤肓诵碌牟考拇a。有利于功能的擴(kuò)展。

  6.2 缺點(diǎn)

    6.2.1 需要抉擇使用透明方式還是安全方式。

    6.2.2 透明方式違背了面向?qū)ο蟮膯我宦氊?zé)原則;安全方式增加了客戶需要端判定的負(fù)擔(dān)。

  6.3 適用場(chǎng)景

    6.3.1 當(dāng)想表達(dá)對(duì)象的部分-整體的層次結(jié)構(gòu)時(shí)

    6.3.3 希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象時(shí)。

相關(guān)文章

  • C#基于Socket的網(wǎng)絡(luò)通信類(lèi)你了解嗎

    C#基于Socket的網(wǎng)絡(luò)通信類(lèi)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C#基于Socket的網(wǎng)絡(luò)通信類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例

    Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例

    這篇文章主要介紹了Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • c# 將Minio.exe注冊(cè)成windows服務(wù)

    c# 將Minio.exe注冊(cè)成windows服務(wù)

    這篇文章主要介紹了c# 如何將Minio.exe注冊(cè)成windows服務(wù),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • C# 創(chuàng)建EXCEL圖表并保存為圖片的實(shí)例

    C# 創(chuàng)建EXCEL圖表并保存為圖片的實(shí)例

    下面小編就為大家分享一篇C# 創(chuàng)建EXCEL圖表并保存為圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼

    C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼

    這篇文章主要介紹了C#調(diào)用RabbitMQ實(shí)現(xiàn)消息隊(duì)列的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#計(jì)算字符串哈希值(MD5、SHA)的方法小結(jié)

    C#計(jì)算字符串哈希值(MD5、SHA)的方法小結(jié)

    這篇文章主要介紹了C#計(jì)算字符串哈希值(MD5、SHA)的方法,以實(shí)例形式較為詳細(xì)的分析總結(jié)了C#計(jì)算字符串哈希值的各種常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#.NET實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)登錄的方法

    C#.NET實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)登錄的方法

    這篇文章主要介紹了C#.NET實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)登錄的方法,以實(shí)例形式分析了C#實(shí)現(xiàn)點(diǎn)擊自動(dòng)登錄的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Unity UGUI的InputField輸入框組件使用詳解

    Unity UGUI的InputField輸入框組件使用詳解

    這篇文章主要為大家介紹了Unity UGUI的InputField輸入框組件使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C# Word 類(lèi)庫(kù)的深入理解

    C# Word 類(lèi)庫(kù)的深入理解

    本篇文章是對(duì)C#中的Word類(lèi)庫(kù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C# JavaScriptSerializer序列化時(shí)的時(shí)間處理詳解

    C# JavaScriptSerializer序列化時(shí)的時(shí)間處理詳解

    這篇文章主要為大家詳細(xì)介紹了C# JavaScriptSerializer序列化時(shí)的時(shí)間處理詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論