Decorator:動態給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更爲靈活;
以下爲裝飾模式的UML圖:
1. Component是定義一個對象接口,可以給這些對象動態添加職責;
2. ConcreteComponent是定義了一個具體的對象,也可以給這個對象添加一些職責;
3. Decorator是裝飾抽象類,繼承了component,從外來類擴展component的功能,但是對於component來說,是無需知道Decorator存在的;
4. 其餘繼承了Decorator就是具體的裝飾類,給component添加職責的功能;
以下爲實現代碼: public abstract class Component
{
public abstract void Operation();
}
public class ConcreateComponent : Component
{
public override void Operation()
{
Console.WriteLine("ConcreateComponent");
}
}
public abstract class Decorator : Component
{
private Component _concreateComponent;
public void SetDecorator(Component concreateComponent)
{
this._concreateComponent = concreateComponent;
}
public override void Operation()
{
if (_concreateComponent != null)
_concreateComponent.Operation();
}
}
public class ConcreateDecoratorA : Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreateDecoratorA");
}
}
public class ConcreateDecoratorB : Decorator
{
public override void Operation()
{
base.Operation();
Console.WriteLine("ConcreateDecoratorB");
}
}
客戶端的調用代碼:
ConcreateComponent com = new ConcreateComponent();
ConcreateDecoratorA comA = new ConcreateDecoratorA();
ConcreateDecoratorB comB = new ConcreateDecoratorB();
comA.SetDecorator(com);
comB.SetDecorator(comA);
comB.Operation();
代碼執行步驟:
1. 實例化ConcreateComponent、ConcreateDecoratorA、ConcreateDecoratorB三個對象;繼承對象的實例化順序爲:先實例化準備實例化的父類,依次往上直至object類,實例化的順序爲從object開始依次往下實例化,直至實例化到待實例化的對象;
2. comA繼承自Decorator,所以comA類繼承了變量_concreateComponent和方法SetDecorator(),comA.SetDecorator(com)執行的是:將comA父類的實例的變量concreateComponent賦值爲com;
3. comB繼承自Decorator,所以comB類繼承變量_concreateComponent和方法SetDecorator(),comB.SetDecorator(comA)執行的是:將comB父類的實例的變量concreateComponent賦值爲comA;
4. comB.Operation()執行步驟爲:
a. 調用comB的Operation()方法,執行到comB的Operation方法的base.Operation()句時,就是執行DecoratorB的Operation()方法,該方法調用了DecoratorB的_concreateComponent變量,該變量在comB.SetDecorator(comA)中被賦予了值comA;
b. 調用comA的Operation()方法,執行到comA的Operation方法的base.Operation()句時,就是執行DecoratorA的Operation()方法,該方法調用了DecoratorA的_concreateComponent變量,該變量在comA.SetDecorator(com)中被賦予了值com;
c. 調用com的Operation()方法,輸出ConcreateComponent,代碼此時開始反向跳轉,依次輸出ConcreateDecoratorA和ConcreateDecoratorB