亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# 設計模式系列教程-組合模式

2020-01-24 01:08:33
字體:
來源:轉載
供稿:網友

1. 概述

  將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。

2. 解決的問題

  當希望忽略單個對象和組合對象的區別,統一使用組合結構中的所有對象(將這種“統一”性封裝起來)。

3. 組合模式中的角色

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

  3.2 葉子(Leaf):在組合中表示子節點對象,葉子節點不能有子節點。

  3.3 合成部件(Composite):定義有枝節點的行為,用來存儲部件,實現在Component接口中的有關操作,如增加(Add)和刪除(Remove)。

4. 模式解讀

  4.1 組合模式的類圖

http://files.VeVB.COm/file_images/article/201606/2016060111022323.png

  4.2 組合模式的實現代碼

  /// <summary>  /// 一個抽象構件,聲明一個接口用于訪問和管理Component的子部件  /// </summary>  public abstract class Component  {    protected string name;    public Component(string name)    {      this.name = name;    }    /// <summary>    /// 增加一個節點    /// </summary>    /// <param name="component"></param>    public abstract void Add(Component component);    /// <summary>    /// 移除一個節點    /// </summary>    /// <param name="component"></param>    public abstract void Remove(Component component);    /// <summary>    /// 顯示層級結構    /// </summary>    public abstract void Display(int level);  }  /// <summary>  /// 葉子節點  /// </summary>  public class Leaf : Component  {    public Leaf(string name)      : base(name)    { }    /// <summary>    /// 由于葉子節點沒有子節點,所以Add和Remove方法對它來說沒有意義,但它繼承自Component,這樣做可以消除葉節點和枝節點對象在抽象層次的區別,它們具備完全一致的接口。    /// </summary>    /// <param name="component"></param>    public override void Add(Component component)    {      Console.WriteLine("Can not add a component to a leaf.");    }    /// <summary>    /// 實現它沒有意義,只是提供了一個一致的調用接口    /// </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>  /// 定義有枝節點的行為,用來存儲部件,實現在Component接口中對子部件有關的操作  /// </summary>  public class Composite : Component  {    public Composite(string name)      : base(name)    { }    /// <summary>    /// 一個子對象集合,用來存儲其下屬的枝節點和葉節點    /// </summary>    private List<Component> children = new List<Component>();    /// <summary>    /// 增加子節點    /// </summary>    /// <param name="component"></param>    public override void Add(Component component)    {      children.Add(component);    }    /// <summary>    /// 移除子節點    /// </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);      // 遍歷其子節點并顯示      foreach (Component component in children)      {        component.Display(level+2);      }    }  }

  4.3 客戶端代碼

  class Program  {    static void Main(string[] args)    {      // 生成樹根,并為其增加兩個葉子節點      Component root = new Composite("Root");      root.Add(new Leaf("Leaf A in Root"));      root.Add(new Leaf("Leaf B in Root"));      // 為根增加兩個枝節點      Component branchX = new Composite("Branch X in Root");      Component branchY = new Composite("Branch Y in Root");      root.Add(branchX);      root.Add(branchY);      // 為BranchX增加頁節點      branchX.Add(new Leaf("Leaf A in Branch X"));      // 為BranchX增加枝節點      Component branchZ = new Composite("Branch Z in Branch X");      branchX.Add(branchZ);      // 為BranchY增加葉節點      branchY.Add(new Leaf("Leaf in Branch Y"));      // 為BranchZ增加葉節點      branchZ.Add(new Leaf("Leaf in Branch Z"));      // 顯示樹      root.Display(1);      Console.Read();    }  }

  運行結果

http://files.VeVB.COm/file_images/article/201606/2016060111022324.png

5. 透明方式與安全方式

  5.1 透明方式:在Component中聲明所有來管理子對象的方法,其中包括Add,Remove等。這樣實現Component接口的所有子類都具備了Add和Remove方法。這樣做的好處是葉節點和枝節點對于外界沒有區別,它們具備完全一致的接口。

  5.2 安全方式:在Component中不去聲明Add和Remove方法,那么子類的Leaf就不需要實現它,而是在Composit聲明所有用來管理子類對象的方法。

  5.3 兩種方式有缺點:對于透明方式,客戶端對葉節點和枝節點是一致的,但葉節點并不具備Add和Remove的功能,因而對它們的實現是沒有意義的;對于安全方式,葉節點無需在實現Add與Remove這樣的方法,但是對于客戶端來說,必須對葉節點和枝節點進行判定,為客戶端的使用帶來不便。

6. 模式總結

  6.1 優點

    6.1.1 使客戶端調用簡單,它可以一致使用組合結構或是其中單個對象,簡化了客戶端代碼。

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

  6.2 缺點

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

    6.2.2 透明方式違背了面向對象的單一職責原則;安全方式增加了客戶需要端判定的負擔。

  6.3 適用場景

    6.3.1 當想表達對象的部分-整體的層次結構時

    6.3.3 希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象時。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久影视精品| 日韩成人激情影院| 亚洲天堂2020| 亚洲美女精品成人在线视频| 亚洲综合一区二区不卡| 国产成人av在线播放| 97国产一区二区精品久久呦| 91精品国产高清| 91国产一区在线| 欧美精品一区在线播放| 成人午夜激情免费视频| 久久视频在线观看免费| 国产精品久久久亚洲| 国产亚洲精品久久久| 久久久久国产精品免费网站| 国产精品久久久久国产a级| 日韩久久精品电影| 久久精品电影一区二区| 日韩美女写真福利在线观看| 国产成人精品在线播放| 亚洲精品综合精品自拍| 国产欧美精品日韩| 亚洲系列中文字幕| 欧美精品激情在线| 亚洲在线免费观看| 久久亚洲精品中文字幕冲田杏梨| 国产精品久久久久久久av大片| 国产精品爽爽ⅴa在线观看| 亚洲第一精品电影| 欧美大学生性色视频| 91精品久久久久久久久久另类| 日本午夜精品理论片a级appf发布| 亚洲电影免费观看高清完整版在线| 久久亚洲精品毛片| 91丨九色丨国产在线| 国产日韩在线精品av| 亚洲美女动态图120秒| 国产成人精品久久二区二区91| 2025国产精品视频| 丝袜美腿亚洲一区二区| 热久久这里只有精品| 久久久久99精品久久久久| 中文字幕亚洲综合久久筱田步美| 久久久久久久久久国产精品| 91免费看片在线| 亚洲男人av在线| 国产一区二区三区在线看| 国产日韩精品在线播放| 久久久国产影院| 久久久999国产精品| 秋霞午夜一区二区| 国产成人精品av| 91国内产香蕉| 91欧美精品午夜性色福利在线| 国产日韩欧美夫妻视频在线观看| 国产性猛交xxxx免费看久久| 91久久久亚洲精品| 欧美成人激情视频免费观看| 奇门遁甲1982国语版免费观看高清| 国内精品视频在线| 日本精品性网站在线观看| 欧美日韩国产一区二区三区| 红桃视频成人在线观看| 亚洲美女av黄| 91精品国产一区| 日韩精品在线第一页| 久久精品国产精品| 国产成人精品久久| 日韩精品高清视频| 美女久久久久久久久久久| 亚洲一区二区三区xxx视频| 亚洲欧美精品伊人久久| 日韩精品极品在线观看| www.亚洲男人天堂| 国内免费精品永久在线视频| 亚洲人成在线免费观看| 日本久久91av| 国产精品人人做人人爽| 日韩美女av在线| 久久久久久av| 久久在线免费视频| 日韩av中文字幕在线| 亚洲一区二区中文字幕| 色综合久久久久久中文网| 亚洲国产又黄又爽女人高潮的| 精品国产乱码久久久久久虫虫漫画| 国产女人精品视频| 日韩在线免费视频观看| 精品久久久999| 最新国产成人av网站网址麻豆| 欧美极品美女电影一区| 韩国视频理论视频久久| 国产精品嫩草视频| 97久久久久久| 黑人巨大精品欧美一区二区| 亚洲影院色在线观看免费| 国产精品爽爽ⅴa在线观看| 日韩电影免费观看在线观看| 成人中文字幕在线观看| 欧美精品日韩三级| 亚洲毛片在线观看.| 亚洲国产欧美一区二区丝袜黑人| 欧美性xxxxhd| 亚洲mm色国产网站| 亚洲第一国产精品| 美女黄色丝袜一区| 国产精品美女久久久免费| 国产成人91久久精品| 91精品国产综合久久香蕉| 亚洲女人初尝黑人巨大| 91福利视频网| 亚洲а∨天堂久久精品喷水| 亚洲999一在线观看www| 国产日韩在线看片| 久久免费视频这里只有精品| 中文.日本.精品| 久久成人精品电影| 色偷偷9999www| 美女久久久久久久| 国产一区二区三区视频免费| 日韩精品中文字| 亚洲2020天天堂在线观看| 亚洲无线码在线一区观看| 亚洲18私人小影院| 欧美电影在线播放| 久久久视频在线| 成人欧美在线视频| 中文字幕日韩免费视频| 亚洲精品视频在线播放| 亚洲国产美女久久久久| 日韩视频―中文字幕| 成人高h视频在线| 91网站在线免费观看| 欧美日韩999| 精品国产一区二区三区久久狼5月| 亚洲欧美成人一区二区在线电影| 国产精品91久久久久久| 97av在线视频| 久久久久久久国产| 国产精品自产拍在线观看| 国产噜噜噜噜噜久久久久久久久| 国模私拍视频一区| 欧美一区二区三区……| 亚洲午夜未满十八勿入免费观看全集| 日韩免费观看视频| 夜夜狂射影院欧美极品| 国产一区av在线| 日韩精品在线电影| 国产精品一区二区av影院萌芽| 国产一区二区三区在线免费观看| 欧美高清在线视频观看不卡| 精品久久久久久久久久久久| 欧美二区在线播放| 日韩麻豆第一页| 久久福利视频导航| 国模私拍视频一区| 国产精品免费看久久久香蕉| 国产中文字幕日韩| 国产精品男女猛烈高潮激情| 国产欧美最新羞羞视频在线观看| 国产一区二区黑人欧美xxxx| 欧美另类极品videosbest最新版本| 日韩最新在线视频| 久久高清视频免费|