解析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ì)員打造合適的平臺(tái),讓其發(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):
裝飾者模式會(huì)導(dǎo)致設(shè)計(jì)中出現(xiàn)許多小對象,如果過度使用,會(huì)讓程序變的更復(fù)雜。并且更多的對象會(huì)是的差錯(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#設(shè)計(jì)模式編程中外觀模式Facade Pattern的應(yīng)用
- C# 設(shè)計(jì)模式系列教程-外觀模式
- C#設(shè)計(jì)模式之外觀模式介紹
- C#設(shè)計(jì)模式之單例模式實(shí)例講解
- c#設(shè)計(jì)模式 適配器模式詳細(xì)介紹
- C#設(shè)計(jì)模式之觀察者模式實(shí)例講解
- 淺談C#設(shè)計(jì)模式之代理模式
- 詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- C#中利用代理實(shí)現(xiàn)觀察者設(shè)計(jì)模式詳解
- C# 設(shè)計(jì)模式系列教程-策略模式
- C#設(shè)計(jì)模式之Facade外觀模式解決天河城購物問題示例
相關(guān)文章
C#實(shí)現(xiàn)鐘表程序設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)鐘表程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Unity3D游戲開發(fā)數(shù)據(jù)持久化PlayerPrefs的用法詳解
在本篇文章里小編給大家整理了關(guān)于Unity3D游戲開發(fā)之?dāng)?shù)據(jù)持久化PlayerPrefs的使用的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。2019-08-08
C# Record構(gòu)造函數(shù)的行為更改詳解
C# 9 中的record類型是僅具有只讀屬性的輕量級、不可變數(shù)據(jù)類型(或輕量級類),下面這篇文章主要給大家介紹了關(guān)于C# Record構(gòu)造函數(shù)的行為更改的相關(guān)資料,需要的朋友可以參考下2021-08-08
C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法
這篇文章主要介紹了C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10

