動态地給一個對象添加一些額外的職責。
優點:把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功能和裝飾功能區分開了。
已經開發完畢的對象,後期由于業務需要,對舊的對象需要擴充特别多的功能,這時候使用給對象動态地添加新的狀态或者行為(即裝飾模式)方法,而不是使用子類靜态繼承。
比如,剛買一輛汽車如下圖
此汽車不符合你的個性要求,比如外表不夠美觀,發動機馬力不足,不能滿足你的速度激情,于是你需要對汽車的外表進行裝飾,同時需要提高發動機的性能。這些操作通過裝飾模式就能很好地解決問題。最終得到如下圖所示的個性汽車。
Component定義了一個對象接口,可以給這些對象動态地添加職責。
ComcreteComponent定了一個具體的對象,也可以給這個具體的對象添加職責。
Decorator抽象裝飾類,繼承了Component對象接口,從外類擴充Component類的功能,但對于Component來說,是無需知道Decorator的存在。
ConcreteDecoratorA具體的裝飾對象,起到給Component添加職責的功能。
ConcreteDecoratorB具體的裝飾對象,起到給Component添加職責的功能。
1、對象接口Component.cs
public abstract class Component
{
public abstract void Operation();
}
2、實作類ConcreteComponent.cs 繼承于Component接口
public class ConcreteComponent : Component
public override void Operation()
{
Console.WriteLine("開始執行具體的對象...");
}
3、裝飾抽象類Decorator.cs 繼承于Component接口
public abstract class Decorator : Component
private Component m_Component;
public void SetComponent(Component component)
this.m_Component = component;
if (m_Component != null)
{
m_Component.Operation();
}
4、具體的裝飾對象ConcreteDecoratorA.cs 繼承于Decorator抽象類
public class ConcreteDecoratorA : Decorator
private string addedState;
base.Operation();
addedState = "進行了狀态屬性裝飾。";
Console.WriteLine(addedState);
給對象接口Component添加了狀态屬性addedState
5、具體的裝飾對象ConcreteDecoratorB.cs 繼承于Decorator抽象類
public class ConcreteDecoratorB : Decorator
AddedBehavior();
private void AddedBehavior()
Console.WriteLine("進行了操作行為裝飾。");
給對象接口Component添加了操作行為AddedBehavior()
5、用戶端代碼
static void Main(string[] args)
ConcreteComponent cc = new ConcreteComponent();
ConcreteDecoratorA cda = new ConcreteDecoratorA();
ConcreteDecoratorB cdb = new ConcreteDecoratorB();
cda.SetComponent(cc);
cdb.SetComponent(cda);
cdb.Operation();
Console.Read();
此案例對具體元件TextView進行了Border和ScrollBar的裝飾。使TextView更符合項目需求。
裝飾模式,給一個對象動态添加額外職責,這些職責需要由使用者決定加入的方式和時機。裝飾模式提供了“即插即用”的方式,在運作期間決定何時增加何種功能。就增加功能來說,裝飾模式比生成子類更加靈活。
版權
作者:靈動生活 郝憲玮
如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。