一、裝飾模式簡介(Brief Introduction)
動態地給一個對象添加一些額外的職責。
優點:把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功 能和裝飾功能區分開了。
二、解決的問題(What To Solve)
已經開發完畢的對象,後期由於業務需要,對舊的對象需要擴展特別多的功能,這時候使 用給對象動態地添加新的狀態或者行為(即裝飾模式)方法,而不是使用子類靜態繼承。
比如,剛買一輛汽車如下圖
此汽車不符合你的個性要求,比如外表不夠美觀,發動機馬力不足,不能滿足你的速度激 情,於是你需要對汽車的外表進行裝飾,同時需要提高發動機的性能。這些操作通過裝飾模 式就能很好地解決問題。最終得到如下圖所示的個性汽車。
三、裝飾模式分析(Analysis)1、裝飾模式結構
Component定義了一個對象接口,可以給這些對象動態地添加職責。
ComcreteComponent定了一個具體的對象,也可以給這個具體的對象添加職責。
Decorator抽象裝飾類,繼承了Component對象接口,從外類擴展Component類的功能,但 對於Component來說,是無需知道Decorator的存在。
ConcreteDecoratorA具體的裝飾對象,起到給Component添加職責的功能。
ConcreteDecoratorB具體的裝飾對象,起到給Component添加職責的功能。
2、源代碼
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;
}
public override void Operation()
{
if (m_Component != null)
{
m_Component.Operation();
}
}
}
4、具體的裝飾對象ConcreteDecoratorA.cs 繼承於Decorator抽象類
public class ConcreteDecoratorA : Decorator
{
private string addedState;
public override void Operation()
{
base.Operation();
addedState = "進行了狀態屬性裝飾。";
Console.WriteLine(addedState);
}
}
給對象接口Component添加了狀態屬性addedState
5、具體的裝飾對象ConcreteDecoratorB.cs 繼承於Decorator抽象類
public class ConcreteDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
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();
}
給對象接口Component添加了操作行為AddedBehavior()
3、程序運行結果
四.案例分析(Example)
此案例對具體組件TextView進行了Border和ScrollBar的裝飾。使TextView更符合項目需 求。
五、總結(Summary)
裝飾模式,給一個對象動態添加額外職責,這些職責需要由用戶決定加入的方式和時機。 裝飾模式提供了“即插即用”的方式,在運行期間決定何時增加何種功能。就增加功能來說 ,裝飾模式比生成子類更加靈活。
出處:http://www.cnblogs.com/ywqu