1?策略模式
我們創建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法,
我們可以簡單理解為更加不同的策略對象,執行不同策略方法。
?
?
?
?
?
?
?
?
2 類圖
?
?
?
?
3 代碼實現
1)接口:Strategy.java
public interface Strategy {public int doOperation(int num1, int num2);
}
?2)實現類:OperationAdd.java
public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}
3)實現類:OperationSubstract.java
public class OperationSubstract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}
4)實現類:OperationMultiply.java
public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}
5)創建Context.java
public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}
StrategyPatternDemo?里面的main函數
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));}
}
?
?
?
4 運行結果
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
?
?
?
?
?
5 對比狀態模式
我們上面策略模式里面的Demo里面每次都是通過傳遞新的策略對象來構建Context對象,那我們的狀態模式可以理解為我們在Context類里面有單獨設置策略對象的函數,不需要每次進行構建Context,狀態模式是通過狀態轉移來改變 Context 所組合的 State 對象,而策略模式是通過 Context本身的決策來改變組合的 Strategy 對象
?
?
?
?
?
6 代碼實現
我們把上面的Context里面的構造方法里面不要單獨進行傳遞策略對象,我們單獨增加一個SetStrategy這樣的函數來設置策略改變當前類的策略對象具體的屬性值。
Context.java
public class Context {private Strategy strategy;public Context(){}public SetStrategy(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}
public static void main(String[] args) {Context context = new Context(); context.SetStrategy(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context.SetStrategy(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context.SetStrategy(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
部分內容參考鏈接:https://www.runoob.com/design-pattern/state-pattern.html
?
?