解析C#設計模式編程中的裝飾者模式
裝飾者模式定義:不通過派生類增改類屬性動作,而是通過模式設計動態(tài)的達到這種效果,而且比繼承更方便靈活減少程序的復雜性。
舉例
汪峰打造冠軍團隊。
首先團隊類為空,經過汪峰不斷的努力,為團隊爭取學員,也為團隊隊員打造合適的平臺,讓其發(fā)揮。
團隊不斷的變強,變完整,是由裝飾者,根據不同的需求,給基類進行增改,一致最后贏得你的贊同,滿足你的需求。
實現裝配器模式的類圖:
戰(zhàn)隊組建代碼
//汪峰戰(zhàn)隊
abstract class WangFengTeam
{
//執(zhí)行策劃命令
abstract public void Acrion();
}
//學員
class Student : WangFengTeam
{
// Methods
override public void Acrion()
{
Console.WriteLine("汪峰團隊學員情況:");
}
}
// 戰(zhàn)隊總策劃
abstract class Direct : WangFengTeam
{
//汪峰戰(zhàn)隊
protected WangFengTeam team;
// 策劃活動
public void SetComponent(WangFengTeam team)
{
this.team = team;
}
//執(zhí)行策劃
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();
}
裝飾者模式的優(yōu)缺點
看完裝飾者模式的詳細介紹之后,我們繼續(xù)分析下它的優(yōu)缺點。
優(yōu)點:
- 裝飾這模式和繼承的目的都是擴展對象的功能,但裝飾者模式比繼承更靈活
- 通過使用不同的具體裝飾類以及這些類的排列組合,設計師可以創(chuàng)造出很多不同行為的組合
- 裝飾者模式有很好地可擴展性
缺點:
裝飾者模式會導致設計中出現許多小對象,如果過度使用,會讓程序變的更復雜。并且更多的對象會是的差錯變得困難,特別是這些對象看上去都很像。
使用場景
下面讓我們看看裝飾者模式具體在哪些情況下使用,在以下情況下應當使用裝飾者模式:
需要擴展一個類的功能或給一個類增加附加責任。
需要動態(tài)地給一個對象增加功能,這些功能可以再動態(tài)地撤銷。
需要增加由一些基本功能的排列組合而產生的非常大量的功能
.NET中裝飾者模式的實現
在.NET 類庫中也有裝飾者模式的實現,該類就是System.IO.Stream,下面看看Stream類結構:
BufferedStream、CryptoStream和GZipStream其實就是兩個具體裝飾類,這里的裝飾者模式省略了抽象裝飾角色(Decorator)。下面演示下客戶端如何動態(tài)地為MemoryStream動態(tài)增加功能的。
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);
總結
到這里,裝飾者模式的介紹就結束了,裝飾者模式采用對象組合而非繼承的方式實現了再運行時動態(tài)地擴展對象功能的能力,而且可以根據需要擴展多個功能,避免了單獨使用繼承帶來的 ”靈活性差“和”多子類衍生問題“。同時它很好地符合面向對象設計原則中 ”優(yōu)先使用對象組合而非繼承“和”開放-封閉“原則。
上一篇:深入解析C#編程中泛型委托的使用
欄 目:C#教程
本文標題:解析C#設計模式編程中的裝飾者模式
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6697.html
您可能感興趣的文章
- 01-10C#編程實現自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10深入淺出23種設計模式
- 01-10C#編程自學之數據類型和變量二
- 01-10C#編程自學之開篇介紹
- 01-10C#編程自學之數據類型和變量三
- 01-10C#編程自學之運算符和表達式
- 01-10C#編程自學之類和對象
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程自學之數據類型和變量一


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


