設計模式22-策略模式(Strategy)
阿新 • • 發佈:2021-10-28
策略模式的重點在於其實現可以去感知隨意替換,根據不同的場景呼叫不同的實現。
設計模式22-策略模式(Strategy)
概述
策略模式的重點在於其實現可以去感知隨意替換,根據不同的場景呼叫不同的實現。
優點
- 演算法可以自由切換。
- 免使用多重條件判斷。
- 擴充套件性良好。
缺點
- 策略類膨脹。
- 所有策略類都需要對外暴露。
簡單實現
JDK實現
策略模式需要設計一個介面,為一系列策略模式實現類提供統一的方法對外提供呼叫。
interface Strategy { /** * print message * * @param message message */ void print(String message); }
通過不同的實現提供不同的業務邏輯。
public class NormalStrategy implements Strategy {
@Override
public void print(String message) {
System.out.println(message);
}
}
public class ErrorStrategy implements Strategy { @Override public void print(String message) { System.err.println(message); } }
在不同的場景中,通過呼叫不同的實現類來完成不同的業務邏輯。
public class DesignPattenTest { @Test public void strategyDesignPattern() { String message = "this is a message"; Strategy printStrategy = new NormalStrategy(); printStrategy.print(message); printStrategy = new ErrorStrategy(); printStrategy.print(message); } }
原始碼解析
和狀態模式的比較
- 策略模式封裝了業務邏輯,業務邏輯之間是解耦的;狀態模式將業務邏輯封裝到了狀態中,狀態之間存在切換的關係,切換操作可以在上下文或狀態自身內部進行。
- 策略模式根據不同的業務場景切換不同的業務邏輯;狀態模式通過在同一場景中設定不同的狀態來呼叫不同的業務邏輯。
- 策略模式的業務邏輯增刪不影響其他已有的業務邏輯;狀態模式的狀態增刪需要修改其他的狀態實現中的切換狀態邏輯。
- 策略模式可以直接被
Client
呼叫,狀態模式必須通過一個有狀態的Model
來被Client
呼叫。