国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

解析C#設計模式編程中的裝飾者模式

2020-01-24 01:16:07
字體:
來源:轉載
供稿:網友

裝飾者模式定義:不通過派生類增改類屬性動作,而是通過模式設計動態的達到這種效果,而且比繼承更方便靈活減少程序的復雜性。

舉例

汪峰打造冠軍團隊。

首先團隊類為空,經過汪峰不斷的努力,為團隊爭取學員,也為團隊隊員打造合適的平臺,讓其發揮。

團隊不斷的變強,變完整,是由裝飾者,根據不同的需求,給基類進行增改,一致最后贏得你的贊同,滿足你的需求。

實現裝配器模式的類圖:

2016217174042765.png (656×437)

戰隊組建代碼

 //汪峰戰隊  abstract class WangFengTeam  {    //執行策劃命令    abstract public void Acrion();  }  //學員  class Student : WangFengTeam  {    // Methods    override public void Acrion()    {      Console.WriteLine("汪峰團隊學員情況:");    }  }  // 戰隊總策劃  abstract class Direct : WangFengTeam  {    //汪峰戰隊    protected WangFengTeam team;    // 策劃活動    public void SetComponent(WangFengTeam team)    {      this.team = team;    }    //執行策劃    override public void Acrion()    {      if (team != null)      {        team.Acrion();      }    }  }  //男孩唱狂放型的,構建一個組合。  class BoyTeam : Direct  {    // 組合名稱    public string teamName= "鋒利的Jquery";    //具體策劃    override public void Acrion()    {      base.Acrion();      Console.WriteLine("我是汪峰團隊,狂放型的。");    }  }  //女孩唱婉約型的,來個模特表演  class GrilTeam : Direct  {    //具體策劃    override public void Acrion()    {      base.Acrion();            Console.WriteLine("我是汪峰團隊,婉約型的。");      //模特表演      show();    }    public void show()    {      Console.WriteLine("婉約型,走秀");    }  }

客戶端代碼:

 public static void Main()    {      Student team = new Student();      BoyTeam boy = new BoyTeam();      GrilTeam girl = new GrilTeam();      //團隊男孩裝飾      boy.SetComponent(team);      //團隊女孩裝飾      girl.SetComponent(boy);      girl.Acrion();      Console.Read();    }


裝飾者模式的優缺點
看完裝飾者模式的詳細介紹之后,我們繼續分析下它的優缺點。

優點:

  • 裝飾這模式和繼承的目的都是擴展對象的功能,但裝飾者模式比繼承更靈活
  • 通過使用不同的具體裝飾類以及這些類的排列組合,設計師可以創造出很多不同行為的組合
  • 裝飾者模式有很好地可擴展性

缺點:

裝飾者模式會導致設計中出現許多小對象,如果過度使用,會讓程序變的更復雜。并且更多的對象會是的差錯變得困難,特別是這些對象看上去都很像。

使用場景
下面讓我們看看裝飾者模式具體在哪些情況下使用,在以下情況下應當使用裝飾者模式:
需要擴展一個類的功能或給一個類增加附加責任。
需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
需要增加由一些基本功能的排列組合而產生的非常大量的功能


.NET中裝飾者模式的實現
在.NET 類庫中也有裝飾者模式的實現,該類就是System.IO.Stream,下面看看Stream類結構:

2016217174213251.png (562×255)

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

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

總結
到這里,裝飾者模式的介紹就結束了,裝飾者模式采用對象組合而非繼承的方式實現了再運行時動態地擴展對象功能的能力,而且可以根據需要擴展多個功能,避免了單獨使用繼承帶來的 ”靈活性差“和”多子類衍生問題“。同時它很好地符合面向對象設計原則中 ”優先使用對象組合而非繼承“和”開放-封閉“原則。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绩溪县| 拜城县| 牟定县| 徐州市| 木兰县| 礼泉县| 怀集县| 射洪县| 会东县| 鸡东县| 新绛县| 封丘县| 南投市| 社旗县| 陕西省| 沂南县| 利川市| 泸西县| 额济纳旗| 阳山县| 清苑县| 沈阳市| 虹口区| 吕梁市| 通化市| 新巴尔虎左旗| 连江县| 常州市| 稻城县| 南阳市| 乌鲁木齐县| 平泉县| 元阳县| 永登县| 长春市| 油尖旺区| 金溪县| 内黄县| 马鞍山市| 房山区| 德化县|