策略模式 - OK

  策略模式(Strategy):它定義了算法家族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化不會影響到使用算法的客戶。javascript

  策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,它能夠以相同的方式調用全部的算法,減小了各類算法類與使用算法類之間的耦合。事實上你能夠將一個繼承自抽象策略類的稱爲具體策略,就是策略模式中的策略1,策略2......html

  策略模式的優勢:java

  策略模式的Strategy類層次爲Context定義了一系列的可供重用的算法或行爲。繼承有助於析取出這些算法的公共功能。策略模式的另外一個優勢是簡化了單元測試,由於每一個算法都有本身的類,能夠經過本身的接口單獨測試。git

  說了這麼多,策略模式究竟解決的是什麼問題呢?算法

  策略模式就是用來封裝算法的,但在實踐中,咱們發現能夠用它來封裝幾乎任何類型的規則,只要在分析過程當中聽到須要在不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式處理這種變化的可能性。設計模式

  在基本策略模式中,選擇所用具體實現的職責由客戶端對象承擔,並轉給策略模式的Context對象。ide

  策略模式的結構圖:post

      

  策略模式的具體實現代碼示例:單元測試

複製代碼
namespace 策略模式
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("我釣了一條魚,應該怎麼煮呢?");

            Context context;
            context = new Context(new ConcreteStrategyA());  //客戶端依賴具體實現類了
            context.RunMethod();

            context = new Context(new ConcreteStrategyB());
            context.RunMethod();

            Console.ReadKey();
        }
    }

    //抽象算法類
    public abstract class Strategy
    {
        //算法方法
        public abstract void AlgorithmInterface();
    }

    //具體策略1
    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("加水、上蒸籠、開火、清蒸!");
        }
    }

    //具體策略2
    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("熱鍋、放油、紅燒!");
        }
    }

    //上下文
    public class Context
    {
        Strategy strategy;

        //構造方法接收具體對象
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }

        //調用方法
        public void RunMethod()
        {
            strategy.AlgorithmInterface();
        }
    }
}
複製代碼

 

  以上代碼感受到了什麼?策略模式無論建立,它作的事很是少,少到什麼程度?測試

  你傳個對象給我,我幫你調用這個對象的方法(這個工做主要經過Context來維護),我無論你這對象怎麼建立,但你得給我個對象。策略模式無論對象的建立,那麼它實質上是什麼。用類圖說明。

  

  從上面的類圖看到一個問題。由於,我調用你時,我要給你傳個對象,上面的例子直接new()。所以,客戶端依賴於具體實現類了。

  因此,策略模式一般與一些建立對象的模式混合使用,好比負責維護調用具體策略的Context類搭配個簡單工廠:

複製代碼
    public class Context
    {
        Strategy strategy = null;
        //調用方法
        public void RunMethod(string type)
        {
            
            switch (type)
            {
                default:
                case "清蒸":
                    strategy = new ConcreteStrategyA();
                    break;
                case "紅燒":
                    strategy = new ConcreteStrategyB();
                    break;
            }
            strategy.AlgorithmInterface();
        }
    }
複製代碼

  這樣外部就依賴Context類了:

複製代碼
        static void Main(string[] args)
        {
            Console.WriteLine("我釣了一條魚,應該怎麼煮呢?");

            Context context = new Context();
            context.RunMethod("清蒸");
            context.RunMethod("紅燒");

            Console.ReadKey();
        }
複製代碼

  最後回顧一下:

  策略模式無論對象建立,它的目的在於封裝不一樣的算法,根據傳入的對象,調用具體的策略方法,在上面的示例程序加入簡單工廠模式的緣由,是由於要建立對應的具體類,要分清哪些代碼屬於哪一個模式的範疇。

  搞了半天,策略模式就是一個類封裝一個算法,實現一個算法接口,而後搞個Context來調用這些算法。

 
 
分類: 設計模式
 
0
0
 
(請您對文章作出評價)
 
« 上一篇: 簡單工廠模式 - OK
» 下一篇: 裝飾者模式 - OK
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息