最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

剖析設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用

 更新時(shí)間:2016年02月18日 09:32:19   作者:張龍豪  
這篇文章主要介紹了設(shè)計(jì)模式編程中C#對(duì)于組合模式的運(yùn)用,理論上來(lái)說(shuō)組合模式包含抽象構(gòu)件、樹(shù)葉構(gòu)件和樹(shù)枝構(gòu)件三個(gè)角色,需要的朋友可以參考下

一、引言
在軟件開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到處理簡(jiǎn)單對(duì)象和復(fù)合對(duì)象的情況,例如對(duì)操作系統(tǒng)中目錄的處理就是這樣的一個(gè)例子,因?yàn)槟夸浛梢园▎为?dú)的文件,也可以包括文件夾,文件夾又是由文件組成的,由于簡(jiǎn)單對(duì)象和復(fù)合對(duì)象在功能上區(qū)別,導(dǎo)致在操作過(guò)程中必須區(qū)分簡(jiǎn)單對(duì)象和復(fù)合對(duì)象,這樣就會(huì)導(dǎo)致客戶(hù)調(diào)用帶來(lái)不必要的麻煩,然而作為客戶(hù),它們希望能夠始終一致地對(duì)待簡(jiǎn)單對(duì)象和復(fù)合對(duì)象。然而組合模式就是解決這樣的問(wèn)題。下面讓我們看看組合模式是怎樣解決這個(gè)問(wèn)題的。

二、組合模式的詳細(xì)介紹
2.1 組合模式的定義
組合模式允許你將對(duì)象組合成樹(shù)形結(jié)構(gòu)來(lái)表現(xiàn)”部分-整體“的層次結(jié)構(gòu),使得客戶(hù)以一致的方式處理單個(gè)對(duì)象以及對(duì)象的組合。下面我們用繪制的例子來(lái)詳細(xì)介紹組合模式,圖形可以由一些基本圖形元素組成(如直線,圓等),也可以由一些復(fù)雜圖形組成(由基本圖形元素組合而成),為了使客戶(hù)對(duì)基本圖形和復(fù)雜圖形的調(diào)用保持一致,我們使用組合模式來(lái)達(dá)到整個(gè)目的。

組合模式實(shí)現(xiàn)的最關(guān)鍵的地方是——簡(jiǎn)單對(duì)象和復(fù)合對(duì)象必須實(shí)現(xiàn)相同的接口。這就是組合模式能夠?qū)⒔M合對(duì)象和簡(jiǎn)單對(duì)象進(jìn)行一致處理的原因。

2.2 組合模式的實(shí)現(xiàn)
舉例:
家族譜的編寫(xiě):
男性:可傳宗接代,也有權(quán)利把一些人剔除族譜。
女性:記錄到家譜中,但不能傳宗接代。

理解:每一個(gè)小家庭中,爸爸媽媽和我,都是爸爸做主,可踢出我跟媽媽中的任何一個(gè),也可增加任何一個(gè)。組件模式中的組件可以是單獨(dú)一個(gè)對(duì)象組成,也可以是多個(gè)組件組成(一個(gè)家庭,甚至一個(gè)家庭的多級(jí)延續(xù));
類(lèi)圖:

201621892853820.png (630×508)

族員共性代碼:

  //// <summary>
  /// //族人 抽象出來(lái)的族人共性
  /// </summary>
  public abstract class Father
  {
    //族人的姓名
    protected string name = string.Empty;
    public string Name
    {
      get
      {
        return name;
      }
    }

    //增加后代
    public abstract void Add(Father boy);
    //逐出家譜
    public abstract void Remove(Father boy);

    //定義所有族人,做個(gè)簡(jiǎn)介
    public abstract void Intro();
  }家族成員代碼


 //男性后代
  public class Boy : Father
  {
    //構(gòu)造函數(shù)
    public Boy() { }
    public Boy(string Name)
    {
      this.name = Name;
    }

    List<Father> myFamily = new List<Father>();

    //自我簡(jiǎn)介
    public override void Intro()
    {
      Console.WriteLine("我是:{0};", Name);
      foreach (Father f in myFamily)
      {
        f.Intro();
      }
    }

    //增加后代
    public override void Add(Father boy)
    {
      myFamily.Add(boy);
    }

    //逐出家譜
    public override void Remove(Father boy)
    {
      myFamily.Remove(boy);
    }
  }

  //女性后代 
  public class Gril : Father
  {
    //構(gòu)造函數(shù)
    public Gril() { }
    public Gril(string Name)
    {
      this.name = Name;
    }
    //自我簡(jiǎn)介
    public override void Intro()
    {
      Console.WriteLine("我是:{0};", Name);
    }
    //不能添加
    public override void Add(Father store)
    {
      throw new NotImplementedException();
    }
    //不能刪除
    public override void Remove(Father store)
    {
      throw new NotImplementedException();
    }
  }客戶(hù)端代碼:


    public static void Main()
    {
      //爺爺取老婆
      Boy yeye = new Boy("爺爺");
      Gril nainai = new Gril("奶奶");
      yeye.Add(nainai);

      //爺爺要孩子
      Boy baba = new Boy("爸爸");
      Gril gugu = new Gril("姑姑");      
      yeye.Add(gugu);
      yeye.Add(baba);

      //爸爸要我
      Boy me = new Boy("me");
      baba.Add(me);

      //我要孩子
      Boy son = new Boy("son");
      me.Add(son);

      //爺爺?shù)拇蠹彝?,族譜做介紹
      yeye.Intro();

      Console.Read();
    }



2.3組合模式的類(lèi)圖
看完了上面,讓我們具體看看組合模式的類(lèi)圖來(lái)理清楚組合模式中類(lèi)之間的關(guān)系。
透明式的組合模式類(lèi)圖:

201621892954450.png (651×566)

安全式組合模式的類(lèi)圖:

201621893012579.png (607×476)

組合模式中涉及到三個(gè)角色:

  • 抽象構(gòu)件(Component)角色:這是一個(gè)抽象角色,上面實(shí)現(xiàn)中Graphics充當(dāng)這個(gè)角色,它給參加組合的對(duì)象定義出了公共的接口及默認(rèn)行為,可以用來(lái)管理所有的子對(duì)象(在透明式的組合模式是這樣的)。在安全式的組合模式里,構(gòu)件角色并不定義出管理子對(duì)象的方法,這一定義由樹(shù)枝結(jié)構(gòu)對(duì)象給出。
  • 樹(shù)葉構(gòu)件(Leaf)角色:樹(shù)葉對(duì)象時(shí)沒(méi)有下級(jí)子對(duì)象的對(duì)象,上面實(shí)現(xiàn)中Line和Circle充當(dāng)這個(gè)角色,定義出參加組合的原始對(duì)象的行為
  • 樹(shù)枝構(gòu)件(Composite)角色:代表參加組合的有下級(jí)子對(duì)象的對(duì)象,上面實(shí)現(xiàn)中ComplexGraphics充當(dāng)這個(gè)角色,樹(shù)枝對(duì)象給出所有管理子對(duì)象的方法實(shí)現(xiàn),如Add、Remove等。

三、組合模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):

組合模式使得客戶(hù)端代碼可以一致地處理對(duì)象和對(duì)象容器,無(wú)需關(guān)系處理的單個(gè)對(duì)象,還是組合的對(duì)象容器。
將”客戶(hù)代碼與復(fù)雜的對(duì)象容器結(jié)構(gòu)“解耦。
可以更容易地往組合對(duì)象中加入新的構(gòu)件。
缺點(diǎn):使得設(shè)計(jì)更加復(fù)雜??蛻?hù)端需要花更多時(shí)間理清類(lèi)之間的層次關(guān)系。(這個(gè)是幾乎所有設(shè)計(jì)模式所面臨的問(wèn)題)。

注意的問(wèn)題:

有時(shí)候系統(tǒng)需要遍歷一個(gè)樹(shù)枝結(jié)構(gòu)的子構(gòu)件很多次,這時(shí)候可以考慮把遍歷子構(gòu)件的結(jié)構(gòu)存儲(chǔ)在父構(gòu)件里面作為緩存。
客戶(hù)端盡量不要直接調(diào)用樹(shù)葉類(lèi)中的方法(在我上面實(shí)現(xiàn)就是這樣的,創(chuàng)建的是一個(gè)樹(shù)枝的具體對(duì)象,應(yīng)該使用GraphicscomplexGraphics = new ComplexGraphics("一個(gè)復(fù)雜圖形和兩條線段組成的復(fù)雜圖形");),而是借用其父類(lèi)(Graphics)的多態(tài)性完成調(diào)用,這樣可以增加代碼的復(fù)用性。
四、組合模式的使用場(chǎng)景
在以下情況下應(yīng)該考慮使用組合模式:

  • 需要表示一個(gè)對(duì)象整體或部分的層次結(jié)構(gòu)。
  • 希望用戶(hù)忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶(hù)將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。

五、組合模式在.NET中的應(yīng)用

組合模式在.NET 中最典型的應(yīng)用就是應(yīng)用與WinForms和Web的開(kāi)發(fā)中,在.NET類(lèi)庫(kù)中,都為這兩個(gè)平臺(tái)提供了很多現(xiàn)有的控件,然而System.Windows.Forms.dll中System.Windows.Forms.Control類(lèi)就應(yīng)用了組合模式,因?yàn)榭丶↙abel、TextBox等這樣的簡(jiǎn)單控件,同時(shí)也包括GroupBox、DataGrid這樣復(fù)合的控件,每個(gè)控件都需要調(diào)用OnPaint方法來(lái)進(jìn)行控件顯示,為了表示這種對(duì)象之間整體與部分的層次結(jié)構(gòu),微軟把Control類(lèi)的實(shí)現(xiàn)應(yīng)用了組合模式(確切地說(shuō)應(yīng)用了透明式的組合模式)。

六、總結(jié)
到這里組合模式的介紹就結(jié)束了,組合模式解耦了客戶(hù)程序與復(fù)雜元素內(nèi)部結(jié)構(gòu),從而使客戶(hù)程序可以向處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素。

相關(guān)文章

  • 淺談Visual C#進(jìn)行圖像處理(讀取、保存以及對(duì)像素的訪問(wèn))

    淺談Visual C#進(jìn)行圖像處理(讀取、保存以及對(duì)像素的訪問(wèn))

    本文主要介紹利用C#對(duì)圖像進(jìn)行讀取、保存以及對(duì)像素的訪問(wèn)等操作,介紹的比較簡(jiǎn)單,希望對(duì)初學(xué)者有所幫助。
    2016-04-04
  • C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法

    C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法

    這篇文章主要介紹了C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法,涉及C#針對(duì)剪切板操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#?在PDF中添加墨跡注釋Ink?Annotation的步驟詳解

    C#?在PDF中添加墨跡注釋Ink?Annotation的步驟詳解

    PDF中的墨跡注釋表現(xiàn)為徒手涂鴉式的形狀,該類(lèi)型的注釋?zhuān)扇我庵付ㄐ螤铐旤c(diǎn)的位置及個(gè)數(shù),通過(guò)指定的頂點(diǎn),程序?qū)⑦B接各點(diǎn)繪制成平滑的曲線,下面通過(guò)C#程序代碼介紹下在pdf中添加注釋的步驟,感興趣的朋友一起看看吧
    2022-02-02
  • c#實(shí)現(xiàn)多線程局域網(wǎng)聊天系統(tǒng)

    c#實(shí)現(xiàn)多線程局域網(wǎng)聊天系統(tǒng)

    這篇文章主要介紹了c#實(shí)現(xiàn)多線程局域網(wǎng)聊天系統(tǒng)的相關(guān)代碼,有此方面需求的小伙伴可以參考下。
    2015-06-06
  • Parallel.For循環(huán)與普通for循環(huán)的性能比較

    Parallel.For循環(huán)與普通for循環(huán)的性能比較

    這篇文章介紹了Parallel.For循環(huán)與普通for循環(huán)的性能比較,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 解析C#拼接Json串的幾種方法

    解析C#拼接Json串的幾種方法

    本文主要介紹了C#拼接Json串的幾種方法,主要包括了4種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C#中使用HttpPost調(diào)用WebService的方法

    C#中使用HttpPost調(diào)用WebService的方法

    這篇文章介紹了C#中使用HttpPost調(diào)用WebService的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#操作本地文件及保存文件到數(shù)據(jù)庫(kù)的基本方法總結(jié)

    C#操作本地文件及保存文件到數(shù)據(jù)庫(kù)的基本方法總結(jié)

    C#使用System.IO中的文件操作方法在Windows系統(tǒng)中處理本地文件相當(dāng)順手,這里我們還總結(jié)了在Oracle中保存文件的方法,嗯,接下來(lái)就來(lái)看看整理的C#操作本地文件及保存文件到數(shù)據(jù)庫(kù)的基本方法總結(jié)
    2016-05-05
  • c#中(&&,||)與(&,|)的區(qū)別詳解

    c#中(&&,||)與(&,|)的區(qū)別詳解

    這篇文章主要介紹了c#中(&&,||)與(&,|)的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#后臺(tái)調(diào)用前臺(tái)JS函數(shù)方法

    C#后臺(tái)調(diào)用前臺(tái)JS函數(shù)方法

    今天小編就為大家分享一篇關(guān)于C#后臺(tái)調(diào)用前臺(tái)JS函數(shù)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01

最新評(píng)論

杭州市| 南平市| 阿尔山市| 安图县| 马公市| 恩施市| 库伦旗| 海口市| 田东县| 苏尼特左旗| 广安市| 临城县| 威信县| 馆陶县| 大兴区| 青州市| 长兴县| 麻城市| 织金县| 基隆市| 昆山市| 台湾省| 巴彦淖尔市| 大安市| 山东| 富民县| 潼关县| 滦平县| 若尔盖县| 兰考县| 奉新县| 长治市| 丰顺县| 文昌市| 涿州市| 马山县| 襄汾县| 绥江县| 灵石县| 栖霞市| 泽普县|