解析C#設(shè)計(jì)模式編程中的裝飾者模式
裝飾者模式定義:不通過派生類增改類屬性動(dòng)作,而是通過模式設(shè)計(jì)動(dòng)態(tài)的達(dá)到這種效果,而且比繼承更方便靈活減少程序的復(fù)雜性。
舉例
汪峰打造冠軍團(tuán)隊(duì)。
首先團(tuán)隊(duì)類為空,經(jīng)過汪峰不斷的努力,為團(tuán)隊(duì)爭取學(xué)員,也為團(tuán)隊(duì)隊(duì)員打造合適的平臺,讓其發(fā)揮。
團(tuán)隊(duì)不斷的變強(qiáng),變完整,是由裝飾者,根據(jù)不同的需求,給基類進(jìn)行增改,一致最后贏得你的贊同,滿足你的需求。
實(shí)現(xiàn)裝配器模式的類圖:
戰(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 { // 組合名稱 public string teamName= "鋒利的Jquery"; //具體策劃 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰團(tuán)隊(duì),狂放型的。"); } } //女孩唱婉約型的,來個(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ò)展對象的功能,但裝飾者模式比繼承更靈活
- 通過使用不同的具體裝飾類以及這些類的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合
- 裝飾者模式有很好地可擴(kuò)展性
缺點(diǎn):
裝飾者模式會導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小對象,如果過度使用,會讓程序變的更復(fù)雜。并且更多的對象會是的差錯(cuò)變得困難,特別是這些對象看上去都很像。
使用場景
下面讓我們看看裝飾者模式具體在哪些情況下使用,在以下情況下應(yīng)當(dāng)使用裝飾者模式:
需要擴(kuò)展一個(gè)類的功能或給一個(gè)類增加附加責(zé)任。
需要?jiǎng)討B(tài)地給一個(gè)對象增加功能,這些功能可以再動(dòng)態(tài)地撤銷。
需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能
.NET中裝飾者模式的實(shí)現(xiàn)
在.NET 類庫中也有裝飾者模式的實(shí)現(xiàn),該類就是System.IO.Stream,下面看看Stream類結(jié)構(gòu):
BufferedStream、CryptoStream和GZipStream其實(shí)就是兩個(gè)具體裝飾類,這里的裝飾者模式省略了抽象裝飾角色(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é)束了,裝飾者模式采用對象組合而非繼承的方式實(shí)現(xiàn)了再運(yùn)行時(shí)動(dòng)態(tài)地?cái)U(kuò)展對象功能的能力,而且可以根據(jù)需要擴(kuò)展多個(gè)功能,避免了單獨(dú)使用繼承帶來的 ”靈活性差“和”多子類衍生問題“。同時(shí)它很好地符合面向?qū)ο笤O(shè)計(jì)原則中 ”優(yōu)先使用對象組合而非繼承“和”開放-封閉“原則。
上一篇:深入解析C#編程中泛型委托的使用
欄 目:C#教程
下一篇:C#實(shí)現(xiàn)帶進(jìn)度條的ListView
本文標(biāo)題:解析C#設(shè)計(jì)模式編程中的裝飾者模式
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6697.html
您可能感興趣的文章
- 01-10C#編程實(shí)現(xiàn)自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之開篇介紹
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之運(yùn)算符和表達(dá)式
- 01-10C#編程自學(xué)之類和對象
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量一


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)