設計模式-策略模式(Strategy)

簡介:

定義了算法家族,分別封裝起來,能夠讓他們之間相互替換。此模式能夠讓算法的變化,不會影響到使用算法的客戶。【行爲型模式】算法


結構圖:


優勢:

  1. 策略模式是一種定義一系列算法的方法,從概念上來看,這些算法都是完成相同的工做,只是實現不一樣。它能夠以相同的方式調用全部的算法,減小了各類算法類與調用算法類之間的耦合性 ;
  2. 策略模式簡化了單元測試,由於每一種算法都有本身的類,能夠經過調用本身的接口單獨測試;
  3. 策略模式的Strategy類層次爲Context定義了一系列可供重用的算法或行爲。繼承有助於析取出這些算法中的公共功能。

缺點:

  1. 全部策略類都須要對外暴露;
  2. 策略類一多,就很難維護。

應用場景:

須要在不一樣時間應用不一樣的業務規則時,就能夠使用策略模式處理這種變化的可能性。ide


注意事項:

  1. 在基本策略模式中,選擇所用具體實現的職責是在客戶端實現,能夠專有Context類型(可見示例2);
  2. 所用策略都要實現同一接口。

示例:

1.結構類圖的實現:單元測試

Strategy類,定義全部支持的算法的公共接口;測試

ConcreteStrategy類,封裝了具體的算法或行爲,繼承於Strategythis

    /// <summary>
    /// 策略類
    /// </summary>
    public abstract class Strategy
    {
        /// <summary>
        /// 算法接口
        /// </summary>
        public abstract void AlgorithmInterface();
    }

    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("我是策略算法A");
        }
    }

    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("我是策略算法B");
        }
    }

    public class ConcreteStrategyC : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("我是策略算法C");
        }
    }

Context類,用一個ConcreteStrategy來配置,維護一個Strategy對象的引用spa

    /// <summary>
    /// 上下文
    /// </summary>
    public class Context
    {
        private Strategy strategy;

        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        /// <summary>
        /// 上下文接口
        /// </summary>
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }

客戶端3d

 Context context = new Context(new ConcreteStrategyA());
 context.ContextInterface();
 context = new Context(new ConcreteStrategyB());
 context.ContextInterface();
 context = new Context(new ConcreteStrategyC());
 context.ContextInterface();

結果代理

2.策略模式之撩妹2code

話說上次撩妹(代理模式)失敗後,痛定思痛,尋求新的方法。獲得一個智囊【Context】,告訴我如何在不一樣階段使用不一樣的撩妹技巧【Strategy】。對象

撩妹策略

    /// <summary>
    /// 撩妹策略接口
    /// </summary>
    public interface IChaseGirlStrategy
    {
        void ChaseGirl();
    }
    /// <summary>
    /// 相見時的策略
    /// </summary>
    public class XiangjianStrategy : IChaseGirlStrategy
    {
        public void ChaseGirl()
        {
            Console.WriteLine("1.瞭解女孩兒的愛好");
            Console.WriteLine("2.多和女孩聊天");
        }
    }
    /// <summary>
    /// 相識時的策略
    /// </summary>
    public class XiangshiStrategy : IChaseGirlStrategy
    {
        public void ChaseGirl()
        {
            Console.WriteLine("1.約女孩兒看電影");
            Console.WriteLine("2.約女孩兒吃飯");
        }
    }
    /// <summary>
    /// 相知時的策略
    /// </summary>
    public class XiangzhiStrategy : IChaseGirlStrategy
    {
        public void ChaseGirl()
        {
            Console.WriteLine("1.多送小禮物");
            Console.WriteLine("2.相約出去旅遊");
        }
    }

智囊

    /// <summary>
    /// 智囊
    /// </summary>
    public class BigThink
    {
        private IChaseGirlStrategy strategy;
        /// <summary>
        /// 策略模式和工廠模式結合
        /// </summary>
        /// <param name="type"></param>
        public BigThink(string type)
        {
            switch (type)
            {
                case "1": strategy = new XiangjianStrategy(); break;
                case "2": strategy = new XiangshiStrategy(); break;
                case "3": strategy = new XiangzhiStrategy(); break;
            }
        }
        /// <summary>
        /// 獲取策略
        /// </summary>
        public void GetStrategy()
        {
            strategy.ChaseGirl();
        }
    }

客戶端

string[] flags = { "1", "2", "3" };
Console.WriteLine("*************************************");
Console.WriteLine("請選擇所處階段,獲取相應策略");
Console.WriteLine("【1】:相見時...");
Console.WriteLine("【2】:相識時...");
Console.WriteLine("【3】:相知時...");
Console.WriteLine("*************************************");
bool isRun = true;
do
{
    var flag = Console.ReadLine();
    if (flags.Contains(flag))
    {
        BigThink bigThink = new BigThink(flag);
        bigThink.GetStrategy();
        Console.WriteLine(".............................");
        Console.WriteLine("按上述指令以外按鍵退出...");
    }
    else
    {
        isRun = false;
    }

} while (isRun);

結果

請多多指教~

相關文章
相關標籤/搜索