裝飾模式-Decorator Pattern

設計模式

目的:動態功能附加在物件上。

何謂裝飾模式?
       裝飾模式動態將責任附加在物件上,若要擴展功能上,裝飾者提供比繼承更有彈性的
替代方案。

為什麼使用它?
       利用繼承的特性,可以使兒子具備有老爸的屬性和方法,兒子繼承老爸之後,因為需
求狀況,透過重寫方式加強老爸的方法一些功能,也可以重新定義某些屬性,覆蓋老爸原
有屬性與方法讓老爸有不同類別功能,再來它的意義在於動態給物件與增加額外的職責

Component:被裝飾的中心元件
Decorator:裝飾中心元件的其他元件

    class Program
    {
        //第五步:撰寫主程式
        static void Main(string[] args)
        {
            ConcreteComponent c = new ConcreteComponent();
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();
            d1.SetComponent(c);
            d2.SetComponent(d1);
            d2.Operation();
        }

    }
    //第一步:給一個抽象類別,規範方法
    abstract class Component
    {
        public abstract void Operation();
    }
    //第二步:給具體組件
    class ConcreteComponent:Component
    {
        public override void Operation()
        {
            Console.WriteLine("ConcreteComponent.Operation()");
        }
    }
    //第三步:抽象裝飾者
    abstract class Decorator:Component
    {
        protected Component component;
        public void SetComponent(Component component)
        {
            this.component = component;
        }

        public override void Operation()
        {
            if (component !=null)
            {
                component.Operation();
            }
        }
    }
    //第四步:具體抽象者
    class ConcreteDecoratorA:Decorator
    {
        public override void Operation()
        {
            base.Operation();
            Console.WriteLine("ConcreteDecoratorA.Operation()");
        }
    }
    
    class ConcreteDecoratorB:Decorator
    {
        public override void Operation()
        {
            base.Operation();
            AddedBehavior();
            Console.WriteLine("ConcreteDecoratorB.Operation()");
        }

        void AddedBehavior()
        {
            
        }
    }
    

來個案例,我今天去天瓏買了單元測試藝術,想加購Design Pattern,ASP.net MVC

按照上面的步驟
步驟一:定義一個抽象類別叫做書

    abstract class Book
    {
        public abstract void Buy();
    }


步驟二:我要的IT書或是電腦書都可

    class ITBook : Book
    {
        public override void Buy()
        {
            Console.WriteLine("我去天瓏資訊買的書:");
        }
    }

步驟三:抽象裝飾者,我要針對電腦書籍做裝飾者

    abstract class ITBookDecorator : Book
    {
        protected Book book;

        public void SetBook(Book book)
        {
            this.book = book;
        }

        public override void Buy()
        {
            if (this.book != null)
            {
                book.Buy();
            }
        }
    }

第四步:具體抽象者 ,買了單元測試藝術,加購其他書

 
    class UnitTestArt_Decorator : ITBookDecorator
    {
        public override void Buy()
        {
            base.Buy();
            Console.WriteLine("購買單元測試藝術");
        }
    }

    class DesignPattern_Decorator : ITBookDecorator
    {
        public override void Buy()
        {
            base.Buy();
            Console.WriteLine("加購Design Pattern");
        }
    }

    class AspNetMvc_Decorator : ITBookDecorator
    {
        public override void Buy()
        {
            base.Buy();
            Console.WriteLine("加購ASP.net MVC");
        }
    }

第五步:撰寫主程式
 

    class Program
    {
        private static void Main(string[] args)
        {
            ITBook itBook = new ITBook();
            UnitTestArt_Decorator unitTest = new UnitTestArt_Decorator();
            DesignPattern_Decorator designPattern = new DesignPattern_Decorator();
            AspNetMvc_Decorator aspNetMvc = new AspNetMvc_Decorator();
            unitTest.SetBook(itBook);
            designPattern.SetBook(unitTest);
            aspNetMvc.SetBook(designPattern);
            aspNetMvc.Buy();
        }
    }

 

元哥的筆記