一、什麼是策略模式?
策略模式就是定義一系列的算法,並將它們封裝,使他們可以相互替換。策略模式使得算法以獨立於客戶而變化。
策略模式涉及到以下幾個角色:
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
四、策略模式和狀態模式、模板方法模式的區別
看到策略模式,是不是和狀態模式與模板方法模式有點相像呢?那麼具體有什麼不同呢?
狀態模式強調的是狀態,可以根據不同的外部情況作出不同的響應,這種不同的行爲不是通過重寫同一個方法實現的。而策略模式我們從框圖中可以看到,其具體的策略是從同一個接口中得到的,策略模式是多態的一種表現。
具體策略類都實現了同一個接口方法,這看起來和模板方法模式很像。但是他們在設計的思想上差別。模板方法模式中的模板方法的執行順序大致上由基類所控制,子類只是重寫了模板方法中的一小部分,子類不會改變整體算法的執行邏輯。而策略模式所有的算法都會在子類的完成,強調具體行爲的不同。