裝飾模式

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


發佈了41 篇原創文章 · 獲贊 7 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章