裝飾者模式

裝飾者模式:動態地給一個對象添加一些額外的職責,就增長功能來講,Decorator模式比生成子類更爲靈活。ide

  Decorator模式的工做原理是:能夠建立始於Decorator對象(負責新的功能的對象)終於原對象的一個對象「鏈」。學習

適用性this

在如下狀況下能夠使用 Decorator 模式:設計

  • 在不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責。
  • 處理那些能夠撤銷的職責。
  • 當不能採用生成子類的方法進行擴充時。

缺點component

  • Decorator 是一個透明的包裝,其與 Component 仍是有些差異的。
  • 採用 Decorator 模式進行系統設計每每會產生許多看上去相似的小對象。致使很難學習系統,排錯也很困難。

效果對象

  • 比靜態繼承更靈活。
  • 避免在層次結構高層的類有太多的特徵。

結構blog

 

例:繼承

    class Program
    {
        static void Main(string[] args)
        {
            Car car=new Car();
            car.Operation();

            ComponentA componentA = new ComponentA(car);
            componentA.Operation();

            Console.WriteLine("\r\n");

            Truck truck = new Truck();
            truck.Operation();

            ComponentB componentB=new ComponentB(truck);
            componentB.Operation();

            Console.ReadKey();
        }

        public class Car : Component
        {
            public override void Operation()
            {
                Console.WriteLine("我是普通的轎車,速度90km/h!\r\n");
            }
        }

        public class Truck:Component
        {
            public override void Operation()
            {
                Console.WriteLine("我是普通的卡車,速度50km/h!\r\n");
            }
        }

        public abstract class Component
        {
            public abstract void Operation();
        }

        public class ComponentA : Component
        {
            private Component _component;

            public ComponentA(Component component)
            {
                this._component = component;
            }

            public override void Operation()
            {                
                this._component.Operation();
                AddNewEngine();
                Console.WriteLine("增長了液氮推動器,速度狂飆到200km/h!\r\n");
            }

            public void AddNewEngine()
            {
                Console.Write("增長液氮推動器!\r\n");
            }
        }

        public class ComponentB:Component
        {
            private Component _component;

            public ComponentB(Component component)
            {
                _component = component;
            }

            public override void Operation()
            {
                
                _component.Operation();
                AddNewEngine();
                Console.WriteLine("增長了火箭推動器,速度狂飆到300km/h!\r\n");
            }

            public void AddNewEngine()
            {
                Console.WriteLine("增長火箭推動器!\r\n");
            }
        }
    }

  運行結果:string

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息