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

來源:互聯網
上載者:User
裝飾者模式定義:不通過衍生類別增改類屬性動作,而是通過模式設計動態達到這種效果,而且比繼承更方便靈活減少程式的複雜性。

舉例

汪峰打造冠軍團隊。

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

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

實現裝配器模式的類圖:

戰隊組建代碼

//汪峰戰隊 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類結構:

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);

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.