In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use.
——Quote from wikipediajava
在計算機編程中,策略模式(也稱爲策略模式)是一種行爲軟件設計模式,它支持在運行時選擇算法。代碼接收運行時指令,而不是直接實現單個算法,這些指令在一系列算法中使用。算法
[站外圖片上傳中...(image-c98784-1573659608688)]編程
優勢: 一、算法能夠自由切換。 二、避免使用多重條件判斷。 三、擴展性良好。設計模式
缺點: 一、策略類會增多。 二、全部策略類都須要對外暴露。ide
使用場景: 一、若是在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲。 二、一個系統須要動態地在幾種算法中選擇一種。 三、若是一個對象有不少的行爲,若是不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。this
注意事項:若是一個系統的策略多於四個,就須要考慮使用混合模式,解決策略類膨脹的問題。設計
這裏咱們經過計算加減乘除來實例策略模式的運用,以算法爲基類,其子類實現相關的運算邏輯,咱們經過選擇相應的子類來決定使用什麼樣的算法。code
interface Strategy { int doOperation(int num1, int num2); } class OperationAdd implements Strategy { @Override public int doOperation(int num1, int num2) { System.out.println("add: " + num1 + "+" + num2); return num1 + num2; } } class OperationSubtract implements Strategy { @Override public int doOperation(int num1, int num2) { System.out.println("substract: " + num1 + "-" + num2); return num1 - num2; } } class OperationMultiply implements Strategy { @Override public int doOperation(int num1, int num2) { System.out.println("multiply: " + num1 + "*" + num2); return num1 * num2; } } class OperationDivide implements Strategy { @Override public int doOperation(int num1, int num2) { System.out.println("divide: " + num1 + "/" + num2); return num1 / num2; } } class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.doOperation(num1, num2); } } public class Demo { public static void main(String[] args) { Context context1 = new Context(new OperationAdd()); int result1 = context1.executeStrategy(9, 3); System.out.println("strategy result: "+result1+"\n"); Context context2 = new Context(new OperationMultiply()); int result2 = context2.executeStrategy(9, 3); System.out.println("strategy result: "+result2+"\n"); Context context3 = new Context(new OperationSubtract()); int result3 = context3.executeStrategy(9, 3); System.out.println("strategy result: "+result3+"\n"); } }
add: 9+3 strategy result: 12 multiply: 9*3 strategy result: 27 substract: 9-3 strategy result: 6