大話設計模式讀書筆記5——裝飾模式

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

裝飾模式結構圖:this

裝飾模式實現代碼:spa

    /// <summary>
    /// 聲明一個Component的抽象基類
    /// </summary>
    abstract class Component
    {
        public abstract void Operation();
    }

    /// <summary>
    ///聲明一個具體的Component,繼承Component
    /// </summary>
    class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("ConcreteComponent.Operation()");
        }
    }

    /// <summary>
    /// 聲明一個抽象的裝飾類'Decorator'
    /// 並繼承Component
    /// </summary>
    abstract class Decorator : Component
    {
        protected Component component;

        //裝飾方法
        public void SetComponent(Component component)
        {
            this.component = component;
        }

        //重寫 Operation 方法
        public override void Operation()
        {
            if (component != null)
            {
                component.Operation();
            }
        }
    }

    /// <summary>
    /// 聲明一個具體裝飾類A,繼承Decorator
    /// </summary>
    class ConcreteDecoratorA : Decorator
    {
        public override void Operation()
        {
            //一些功能擴展
            Console.WriteLine("ConcreteDecoratorA.Operation()");
            base.Operation();            
        }
    }

    /// <summary>
    /// 聲明一個具體裝飾類B,繼承Decorator
    /// </summary>
    class ConcreteDecoratorB : Decorator
    {
        public override void Operation()
        {
           //一些功能擴展
            AddedBehavior();
            Console.WriteLine("ConcreteDecoratorB.Operation()");
            base.Operation();
        }

        //裝飾類B自有方法
        void AddedBehavior()
        {
        }
    }

 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();
           
            Console.ReadKey();
        }
    }

  執行結果:3d

 咱們能夠經過一個簡單是實例,還應用一下裝飾模式,好比如今有一種坦克,坦克有不少的型號和特點,有的具備紅外功能,有的具備GPS定位功能,經過使用裝飾模式,大大下降了子類的膨脹。code

 //坦克基類
    public class Tank
    {
        /// <summary>
        /// 射擊
        /// </summary>
        public virtual void Shoot()
        {

        }

    }

    //T50 型坦克
    public class T50Tank:Tank
    {
        public override void Shoot()
        {
            Console.WriteLine("T50 型號坦克射擊");
        }
    }

    //T51型坦克
    public class T51Tank : Tank
    {
        public override void Shoot()
        {
            Console.WriteLine("T51 型號坦克射擊");
        }
    }

    //裝飾基類
    public abstract class Decorator : Tank
    {
        protected Tank tank;

        //利用構造器進行裝飾
        public Decorator(Tank tank)
        {
            this.tank = tank;
        }          

        public override void Shoot()
        {
            if (tank != null)
            {
                tank.Shoot();
            }
        }
    }

    //具備紅外功能
    public class InfraRed : Decorator
    {
        public InfraRed(Tank tank)
            : base(tank)
        {

        }
    
        public override void Shoot()
        {
            Console.WriteLine("帶紅外功能");
            base.Shoot();
        }
    }

    //具備GPS功能
    public class GPS : Decorator
    {
        public GPS(Tank tank)
            : base(tank)
        {

        }
        public override void Shoot()
        {
            Console.WriteLine("帶GPS功能");
            base.Shoot();
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            //聲明一個T50型坦克
            Tank t50Tank = new T50Tank();
            //給T50型坦克賦予紅外功能
            InfraRed red = new InfraRed(t50Tank);
            //給T50型坦克賦予GPS功能
            GPS gps = new GPS(red);
            gps.Shoot();          

            Console.ReadKey();
        }
    }

 執行結果:component

相關文章
相關標籤/搜索