策略模式
策略模式
-行爲型模式。
在策略模式中,實例代碼創建表示各種策略的對象和一個行爲隨着策略對象改變而改變的context對象。策略對象改變context對象的執行算法。
目的和手段
:將相似的算法封裝成類,使他們可以任意的替換,來解決使用if…else多重條件選擇語句所帶來的複雜和難以維護。
關鍵代碼
:所有封裝成類的算法,實現同一個接口。
注意事項
:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
參考鏈接
:https://www.runoob.com/design-pattern/strategy-pattern.html
代碼分析(先看代碼示例):
- 首先,要明確,策略分析其實是爲了代替多重選擇語句的複雜型,就像裝飾器模式是繼承的一種替代模式(這裏說的“替代”,不是指技術上的替代,而是指繼承能實現的功能,用策略模式來實現更簡潔更優雅)。
- 實例代碼邏輯很清晰,重點在於Context類中的Strategy實例,這個千萬不能忘記,因爲有了這個實例變量,才讓各個策略對象可以改變context的行爲。在執行context的executeStrategy()方法時,在初始化context時,傳入的不同策略類型參數,決定了executeStrategy()方法實際調用的代碼位置。
- UML類圖如下:
示例代碼
interface Strategy {
public int doOperation(int num1, int num2);
}
class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
class OperationSubstract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int 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 StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}