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

解析C#設(shè)計(jì)模式編程中的裝飾者模式

 更新時(shí)間:2016年02月17日 17:43:31   作者:張龍豪  
這篇文章主要介紹了C#設(shè)計(jì)模式編程中的裝飾者模式,同時(shí)也談到了其在.NET框架中的應(yīng)用,需要的朋友可以參考下

裝飾者模式定義:不通過(guò)派生類(lèi)增改類(lèi)屬性動(dòng)作,而是通過(guò)模式設(shè)計(jì)動(dòng)態(tài)的達(dá)到這種效果,而且比繼承更方便靈活減少程序的復(fù)雜性。

舉例

汪峰打造冠軍團(tuán)隊(duì)。

首先團(tuán)隊(duì)類(lèi)為空,經(jīng)過(guò)汪峰不斷的努力,為團(tuán)隊(duì)爭(zhēng)取學(xué)員,也為團(tuán)隊(duì)隊(duì)員打造合適的平臺(tái),讓其發(fā)揮。

團(tuán)隊(duì)不斷的變強(qiáng),變完整,是由裝飾者,根據(jù)不同的需求,給基類(lèi)進(jìn)行增改,一致最后贏得你的贊同,滿足你的需求。

實(shí)現(xiàn)裝配器模式的類(lèi)圖:

2016217174042765.png (656×437)

戰(zhàn)隊(duì)組建代碼

 //汪峰戰(zhàn)隊(duì)
  abstract class WangFengTeam
  {
    //執(zhí)行策劃命令
    abstract public void Acrion();
  }

  //學(xué)員
  class Student : WangFengTeam
  {
    // Methods
    override public void Acrion()
    {
      Console.WriteLine("汪峰團(tuán)隊(duì)學(xué)員情況:");
    }
  }

  // 戰(zhàn)隊(duì)總策劃
  abstract class Direct : WangFengTeam
  {
    //汪峰戰(zhàn)隊(duì)
    protected WangFengTeam team;

    // 策劃活動(dòng)
    public void SetComponent(WangFengTeam team)
    {
      this.team = team;
    }
    //執(zhí)行策劃
    override public void Acrion()
    {
      if (team != null)
      {
        team.Acrion();
      }
    }
  }

  //男孩唱狂放型的,構(gòu)建一個(gè)組合。
  class BoyTeam : Direct
  {
    // 組合名稱(chēng)
    public string teamName= "鋒利的Jquery";

    //具體策劃
    override public void Acrion()
    {
      base.Acrion();
      Console.WriteLine("我是汪峰團(tuán)隊(duì),狂放型的。");
    }
  }

  //女孩唱婉約型的,來(lái)個(gè)模特表演
  class GrilTeam : Direct
  {
    //具體策劃
    override public void Acrion()
    {
      base.Acrion();      

      Console.WriteLine("我是汪峰團(tuán)隊(duì),婉約型的。");

      //模特表演
      show();
    }

    public void show()
    {
      Console.WriteLine("婉約型,走秀");
    }
  }

客戶端代碼:

 public static void Main()
    {
      Student team = new Student();
      BoyTeam boy = new BoyTeam();
      GrilTeam girl = new GrilTeam();

      //團(tuán)隊(duì)男孩裝飾
      boy.SetComponent(team);
      //團(tuán)隊(duì)女孩裝飾
      girl.SetComponent(boy);
      girl.Acrion();
      Console.Read();
    }


裝飾者模式的優(yōu)缺點(diǎn)
看完裝飾者模式的詳細(xì)介紹之后,我們繼續(xù)分析下它的優(yōu)缺點(diǎn)。

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

  • 裝飾這模式和繼承的目的都是擴(kuò)展對(duì)象的功能,但裝飾者模式比繼承更靈活
  • 通過(guò)使用不同的具體裝飾類(lèi)以及這些類(lèi)的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合
  • 裝飾者模式有很好地可擴(kuò)展性

缺點(diǎn):

裝飾者模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小對(duì)象,如果過(guò)度使用,會(huì)讓程序變的更復(fù)雜。并且更多的對(duì)象會(huì)是的差錯(cuò)變得困難,特別是這些對(duì)象看上去都很像。

使用場(chǎng)景
下面讓我們看看裝飾者模式具體在哪些情況下使用,在以下情況下應(yīng)當(dāng)使用裝飾者模式:
需要擴(kuò)展一個(gè)類(lèi)的功能或給一個(gè)類(lèi)增加附加責(zé)任。
需要?jiǎng)討B(tài)地給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)地撤銷(xiāo)。
需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能


.NET中裝飾者模式的實(shí)現(xiàn)
在.NET 類(lèi)庫(kù)中也有裝飾者模式的實(shí)現(xiàn),該類(lèi)就是System.IO.Stream,下面看看Stream類(lèi)結(jié)構(gòu):

2016217174213251.png (562×255)

BufferedStream、CryptoStream和GZipStream其實(shí)就是兩個(gè)具體裝飾類(lèi),這里的裝飾者模式省略了抽象裝飾角色(Decorator)。下面演示下客戶端如何動(dòng)態(tài)地為MemoryStream動(dòng)態(tài)增加功能的。

MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99});
      // 擴(kuò)展緩沖的功能
      BufferedStream buffStream = new BufferedStream(memoryStream);
      // 添加加密的功能
      CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write);
      // 添加壓縮功能
      GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);

總結(jié)
到這里,裝飾者模式的介紹就結(jié)束了,裝飾者模式采用對(duì)象組合而非繼承的方式實(shí)現(xiàn)了再運(yùn)行時(shí)動(dòng)態(tài)地?cái)U(kuò)展對(duì)象功能的能力,而且可以根據(jù)需要擴(kuò)展多個(gè)功能,避免了單獨(dú)使用繼承帶來(lái)的 ”靈活性差“和”多子類(lèi)衍生問(wèn)題“。同時(shí)它很好地符合面向?qū)ο笤O(shè)計(jì)原則中 ”優(yōu)先使用對(duì)象組合而非繼承“和”開(kāi)放-封閉“原則。

相關(guān)文章

  • C#?EF?Core可視化工具的使用及EF?Core入門(mén)語(yǔ)句操作代碼

    C#?EF?Core可視化工具的使用及EF?Core入門(mén)語(yǔ)句操作代碼

    EF?Core?可用作對(duì)象關(guān)系映射程序?(O/RM),以便于?.NET?開(kāi)發(fā)人員能夠使用?.NET?對(duì)象來(lái)處理數(shù)據(jù)庫(kù),這樣就不必經(jīng)常編寫(xiě)大部分?jǐn)?shù)據(jù)訪問(wèn)代碼了,接下來(lái)通過(guò)本文給大家介紹C#?EF?Core可視化工具的使用及EF?Core入門(mén)語(yǔ)句,感興趣的朋友一起看看吧
    2022-02-02
  • c# Newtonsoft 六個(gè)值得使用的特性(上)

    c# Newtonsoft 六個(gè)值得使用的特性(上)

    這篇文章主要介紹了c# Newtonsoft 六個(gè)值得使用的特性,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • c#基礎(chǔ)知識(shí)---委托,匿名函數(shù),lambda

    c#基礎(chǔ)知識(shí)---委托,匿名函數(shù),lambda

    這篇文章主要介紹了c# 委托,匿名函數(shù),lambda的相關(guān)知識(shí),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 分享WCF文件傳輸實(shí)現(xiàn)方法---WCFFileTransfer

    分享WCF文件傳輸實(shí)現(xiàn)方法---WCFFileTransfer

    這篇文章主要介紹了分享WCF文件傳輸實(shí)現(xiàn)方法---WCFFileTransfer,需要的朋友可以參考下
    2015-11-11
  • C#中讀取App.config配置文件代碼實(shí)例

    C#中讀取App.config配置文件代碼實(shí)例

    這篇文章主要介紹了C#中讀取App.config配置文件代碼實(shí)例,包括循環(huán)讀取、單個(gè)讀取的方法,需要的朋友可以參考下
    2014-08-08
  • C# 9.0新特性——只初始化設(shè)置器

    C# 9.0新特性——只初始化設(shè)置器

    這篇文章主要介紹了C# 9.0新特性——只初始化設(shè)置器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-11-11
  • C#實(shí)現(xiàn)自定義線程池實(shí)例代碼

    C#實(shí)現(xiàn)自定義線程池實(shí)例代碼

    這篇文章介紹了C#實(shí)現(xiàn)自定義線程池的實(shí)例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#操作注冊(cè)表的方法

    C#操作注冊(cè)表的方法

    以下從‘讀’‘寫(xiě)’‘刪除’‘判斷’四個(gè)事例實(shí)現(xiàn)對(duì)注冊(cè)表的簡(jiǎn)單操作
    2007-03-03
  • 在WPF中使用多線程更新UI

    在WPF中使用多線程更新UI

    這篇文章介紹了在WPF中使用多線程更新UI的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#實(shí)現(xiàn)生成mac地址與IP地址注冊(cè)碼的兩種方法

    C#實(shí)現(xiàn)生成mac地址與IP地址注冊(cè)碼的兩種方法

    這篇文章主要介紹了C#實(shí)現(xiàn)生成mac地址與IP地址注冊(cè)碼的兩種方法,非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

江孜县| 武威市| 酉阳| 葵青区| 中牟县| 景德镇市| 乐业县| 麻阳| 孙吴县| 华安县| 海南省| 衡阳县| 道孚县| 漾濞| 冀州市| 延安市| 珠海市| 海伦市| 天峻县| 万山特区| 淳化县| 连江县| 平和县| 永清县| 莒南县| 哈尔滨市| 澳门| 报价| 桓仁| 丰顺县| 九台市| 大埔县| 邯郸市| 南昌县| 石门县| 尼玛县| 卢龙县| 宝丰县| 长葛市| 丰顺县| 武汉市|