鴨子應用--策略模式


策略模式定義了算法族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。
    abstract class Strategy
    {
        // Methods
        abstract public void AlgorithmInterface();
    }

    // "ConcreteStrategyA"
    class ConcreteStrategyA : Strategy
    {
        // Methods
        override public void AlgorithmInterface()
        {
            Console.WriteLine("Called ConcreteStrategyA.AlgorithmInterface()");
        }
    }

    // "ConcreteStrategyB"
    class ConcreteStrategyB : Strategy
    {
        // Methods
        override public void AlgorithmInterface()
        {
            Console.WriteLine("Called ConcreteStrategyB.AlgorithmInterface()");
        }
    }

    // "Context"
    class Context
    {
        // Fields
        Strategy strategy;

        // Constructors
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }

        // Methods
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }

    /// <summary>
    /// Client test
    /// </summary>
    public class Client
    {
        public static void Main(string[] args)
        {
            // Three contexts following different strategies
            Context c = new Context(new ConcreteStrategyA());
            c.ContextInterface();
        }
    }

using
System; namespace ConsoleApplication1 { #region 繼承實現 public class Duck { public void Quack() { Console.WriteLine("Quack"); } public virtual void DisPlay() { Console.WriteLine("DisPlay"); } } public class MallardDuck : Duck { public override void DisPlay() { Console.WriteLine("green"); } } public class RedHeadDuck : Duck { public override void DisPlay() { Console.WriteLine("red"); } } public class RubberDuck : Duck { public override void DisPlay() { Console.WriteLine("black"); } } /* 新需求:須要加入Fly方法,但RubberDuck不該該有Fly的屬性 * 新需求:須要加入新的Duck種類DecoyDuck,但DecoyDuck不會飛也不會叫*/ /*問題 * 代碼在多個子類中重複 * 新增長的Duck很難預知其行爲 * 運行時的行爲不容易改變 * 牽一髮動全身*/ #endregion #region 接口實現 public class Duck1 { public void Quack() { Console.WriteLine("Quack"); } public virtual void DisPlay() { Console.WriteLine("DisPlay"); } } public interface IFly { void Fly(); } public class MallardDuck1 : Duck1, IFly { public override void DisPlay() { Console.WriteLine("green"); } public void Fly() { Console.WriteLine("MallardFly"); } } public class RedHeadDuck1 : Duck1, IFly { public override void DisPlay() { Console.WriteLine("red"); } public void Fly() { Console.WriteLine("RedHeadFly"); } } public class RubberDuck1 : Duck1 { public override void DisPlay() { Console.WriteLine("black"); } } /* 多種Duck實現IFly內的Fly接口都要編寫相關Fly的代碼,相同的Fly功能代碼沒法重用。 */ #endregion #region 優化 /* 方案 * 多個Duck相同代碼的提取重複利用 * 將變化的功能(Fly)提取成單獨的行爲實現類 * 運行時能夠動態的賦予Duck的Fly類型 */


  /* 這例子真是絕了。。。Duck2基類裏有IFlyBehavior接口。。。不會飛的鴨子繼承了,看起來是什麼鬼樣子。。。
*/


    public class Duck2 { public void Quack() { Console.WriteLine("Quack"); } public virtual void DisPlay() { Console.WriteLine("Black"); } public IFlyBehavior m_flyBehavior; public void FlyPerform() { m_flyBehavior.Fly(); } } // 行爲類
    public interface IFlyBehavior { void Fly(); } public class FlyBehaviorA : IFlyBehavior { public void Fly() { Console.WriteLine("FlyA"); } } public class FlyBehaviorB : IFlyBehavior { public void Fly() { Console.WriteLine("FlyB"); } } public class MallardDuck2 : Duck2 { public MallardDuck2(IFlyBehavior iFly) { m_flyBehavior = iFly; } public override void DisPlay() { Console.WriteLine("green"); } } public class RedHeadDuck2 : Duck2 { public RedHeadDuck2(IFlyBehavior iFly) { m_flyBehavior = iFly; } public override void DisPlay() { Console.WriteLine("red"); } } public class RubberDuck2 : Duck2 { public override void DisPlay() { base.DisPlay(); } } #endregion

    class DuckFactory { public enum DuckType { MALLARD, REDHEAD, RUBBER } public static Duck2 CreateDuck(DuckType type) { switch (type) { case DuckType.MALLARD: return new MallardDuck2(new FlyBehaviorA()); case DuckType.REDHEAD: return new RedHeadDuck2(new FlyBehaviorB()); case DuckType.RUBBER: return new RubberDuck2(); default: Console.WriteLine("Type Error..................."); return null; } } } class Program { static void Main(string[] args) { Duck2 mallard = DuckFactory.CreateDuck(DuckFactory.DuckType.MALLARD); mallard.m_flyBehavior.Fly(); Console.ReadKey(); } } }
相關文章
相關標籤/搜索