設計模式-策略模式

1. 什麼是策略模式

    策略模式(Strategy)是一種行爲型模式,不一樣的算法肯定了程序的不一樣的行爲。java

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

                                                                                                      -- 《大話設計模式》設計模式

    UML類圖:ide

    

2. 使用的場景

    咱們的程序爲了實現某個功能,可能會採起不少種算法,這些算法的目的是相同的,行爲也是類似的,這樣咱們就能夠把這些算法抽象化爲一個策略。例如上篇提到的計算器(各類運算),或者是商城的優惠系統(滿X減Y),地圖導航(根據出發地和目的地給出不一樣的出行方式)。this

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

                                                                                                      -- 《大話設計模式》設計

3. 怎麼使用

    到這裏咱們發現,策略模式簡單工廠模式在某些方面是高度類似的,無論是思想上,仍是在代碼層次上,不過仍是有一點細微的差異。例以下面我用到的示例計算器,經過上一節咱們不難想到簡單工廠模式的實現:定義一個計算接口並定義一個計算的方法,再分別定義不一樣的計算實現類,最後定義一個計算工廠類,經過給定的不一樣的運算符號去決定用哪一個計算實現類。code

    先介紹下策略模式是如何設計並工做的,下一節再將它與簡單工廠模式作一個對比。對象

示例代碼:接口

1. 建立Operation接口,並定義一個calculate的抽象方法

Operation.java

public interface Operation {
    int calculate(int num1, int num2);
}

2. 建立實現該策略的各個實現類

OperationAdd.java

public class OperationAdd implements Operation {
    @Override
    public int calculate(int num1, int num2) {
        return num1 + num2;
    }
}

OperationMinus.java

public class OperationMinus implements Operation {
    @Override
    public int calculate(int num1, int num2) {
        return num1 - num2;
    }
}

3. 建立上下文類Context,並定義一個Strategy對象

Context.java

public class Context {
    private Operation operation;

    public Context(Operation calculator) {
        this.operation = calculator;
    }

    public int getResult(int num1, int num2) {
        return operation.calculate(num1, num2);
    }
}

4. 給Context傳遞策略對象,來實現不一樣的運算

public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context c = new Context(new OperationAdd());
        System.out.println("5 + 2 = " + c.getResult(5, 2));

        c = new Context(new OperationMinus());
        System.out.println("5 - 2 = " + c.getResult(5, 2));
    }
}

5. 輸出:

5 + 2 = 7
5 - 2 = 3

4. 總結

​    策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,它能夠以相同的方式調用全部的算法,減小了各類算法類與使用算法類之間的耦合。在基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔,並轉給策略模式的Context對象。

4.1. 優勢

    1. 上下文和具體策略是鬆耦合關係。所以上下文只知道它要使用某一個實現Strategy接口類的實例,但不須要知道具體是哪個類

    2. 策略模式知足「開-閉原則」。當增長新的具體策略時,不須要修改上下文類的代碼,上下文就能夠引用新的具體策略的實例

4.2. 缺點

    1. 策略類可能會愈來愈多

    2. 全部的策略類都須要暴露給客戶端

4.3. 策略模式和簡單工廠模式的對比

    策略模式和簡單工廠模式看起來很是類似,都是經過多態來實現不一樣子類的選取,這種思想應該是從程序的總體來看得出的。若是從使用這兩種模式的角度來看的話,咱們會發如今簡單工廠模式中咱們只須要傳遞相應的條件就能獲得想要的一個對象,而後經過這個對象實現算法的操做。而策略模式,使用時必須首先建立一個想使用的類對象,而後將該對象做爲參數傳遞進去,經過該對象調用不一樣的算法。在簡單工廠模式中實現了經過條件選取一個類去實例化對象,策略模式則將選取相應對象的工做交給模式的使用者,它自己不去作選取工做。

相關文章
相關標籤/搜索