在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。
在策略模式中,我們創建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。
關鍵代碼:實現同一個接口。
優點: 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。
缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。
注意事項:如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
- 創建一個接口。
/**
* 1. 創建一個接口
* @author mazaiting
*/
public interface Strategy {
/**
* 算法
*/
int doOperation(int num1, int num2);
}
- 創建實現接口的實體類。
/**
* 2. 創建實現接口的實體類。
* @author mazaiting
*/
public class OperationAdd implements Strategy{
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
/**
* 2. 創建實現接口的實體類。
* @author mazaiting
*/
public class OperationSub implements Strategy{
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
/**
* 2. 創建實現接口的實體類。
* @author mazaiting
*/
public class OperationMult implements Strategy{
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
- 創建Context類。
/**
* 3. 創建 Context 類。
* @author mazaiting
*/
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);
}
}
- 使用 Context 來查看當它改變策略 Strategy 時的行為變化。
/**
* 4. 使用 Context 來查看當它改變策略 Strategy 時的行為變化。
* @author mazaiting
*/
public class Client {
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 OperationSub());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMult());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
- 打印結果
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50