設計模式——策略模式

一、什麼是策略模式?

 

  策略模式就是定義一系列的算法,並將它們封裝,使他們可以相互替換。策略模式使得算法以獨立於客戶而變化


  策略模式涉及到以下幾個角色:


  1. 抽象策略角色:定義了具體策略需要實現的抽象方法或接口

  2. 具體策略角色:封裝具體的算法

  3. 環境角色:內部持有策略類對象的引用


  舉一個簡單易懂的例子——計算器,計算器有操作(operation)方法,可以對應加減乘除等不同的具體運算。

 

二、策略模式框圖

 


 


 


三、策略模式的具體實現代碼

 

3.1 Calculate——抽象策略接口

package designpatterns.strategy;

/**
 * Created by Olive on 2017/12/25.
 */
public interface Calculate {
    void operation(double a, double b);
}

3.2 Addition、Subtraction、Multiplication、Division——具體的策略類,分別代表加減乘除四個運算,實現了Calculate接口

package designpatterns.strategy;

/**
 * Created by Olive on 2017/12/25.
 */
public class Addition implements Calculate{

    public void operation(double a, double b) {
        System.out.println((a + b));
    }
}

public class Subtraction implements Calculate{

    public void operation(double a, double b) {
        System.out.println((a - b));
    }
}

public class Multiplication implements Calculate{

    public void operation(double a, double b) {
        System.out.println((a * b));
    }
}

public class Division implements Calculate {

    public void operation(double a, double b) {
        if (b != 0) {
            System.out.println((a / b));
        } else {
            System.out.println("input error!");
        }
    }
}

3.3 Calculator——環境類,定義了四個運算算法的靜態類,可以通過Calculator對象直接調用

package designpatterns.strategy;

/**
 * Created by Olive on 2017/12/25.
 */
public class Calculator {

    public static Addition addition = new Addition();
    public static Subtraction subtraction = new Subtraction();
    public static Multiplication multiplication = new Multiplication();
    public static Division division = new Division();
}

3.4 Client——客戶端

package designpatterns.strategy;

/**
 * Created by Olive on 2017/12/25.
 */
public class Client {

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.addition.operation(1, 1);
        calculator.subtraction.operation(10, 3);
        calculator.multiplication.operation(13, 7);
        calculator.division.operation(16, 5);
    }
}

3.5 結果

2.0
7.0
91.0
3.2

Process finished with exit code 0

 

四、策略模式和狀態模式、模板方法模式的區別

 

  看到策略模式,是不是和狀態模式與模板方法模式有點相像呢?那麼具體有什麼不同呢?


  狀態模式強調的是狀態,可以根據不同的外部情況作出不同的響應,這種不同的行爲不是通過重寫同一個方法實現的。而策略模式我們從框圖中可以看到,其具體的策略是從同一個接口中得到的,策略模式是多態的一種表現


  具體策略類都實現了同一個接口方法,這看起來和模板方法模式很像。但是他們在設計的思想上差別。模板方法模式中的模板方法的執行順序大致上由基類所控制,子類只是重寫了模板方法中的一小部分,子類不會改變整體算法的執行邏輯。而策略模式所有的算法都會在子類的完成,強調具體行爲的不同

 

發佈了49 篇原創文章 · 獲贊 34 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章