將 if-else 語句優化為策略模式通常是在以下場景下考慮的:
1.代碼可讀性差
當 if-else 嵌套或分支過多時,代碼變得難以閱讀和維護。如果新增一個條件需要修改現有代碼,違反了開閉原則(對擴展開放,對修改關閉)。
2.功能擴展頻繁
如果業務邏輯經常需要新增條件分支,每次都需要修改 if-else 結構,容易引入錯誤。使用策略模式可以通過新增類或方法實現擴展,而無需改動已有代碼。
3.邏輯復雜度高
每個分支的邏輯較為復雜,導致單個函數過長。策略模式可以將每個分支的邏輯封裝到獨立的類或方法中,降低耦合度。
4.性能問題
如果 if-else 條件判斷較多且執行頻率高,可能會影響性能。策略模式結合工廠模式或映射表(如字典),可以快速定位對應的邏輯處理。
5.測試難度增加
復雜的 if-else 結構增加了單元測試的覆蓋難度。策略模式將每個分支邏輯分離,便于單獨測試。
示例對比
if-else 實現
public void process(String type) {
if ("A".equals(type)) {
// 處理 A 類型邏輯
} else if ("B".equals(type)) {
// 處理 B 類型邏輯
} else if ("C".equals(type)) {
// 處理 C 類型邏輯
} else {
// 默認邏輯
}
}
策略模式實現
// 定義策略接口
interface Strategy {
void execute();
}
// 具體策略實現
class StrategyA implements Strategy {
public void execute() {
// 處理 A 類型邏輯
}
}
class StrategyB implements Strategy {
public void execute() {
// 處理 B 類型邏輯
}
}
class StrategyC implements Strategy {
public void execute() {
// 處理 C 類型邏輯
}
}
// 上下文類
class Context {
private Map<String, Strategy> strategyMap = new HashMap<>();
public Context() {
strategyMap.put("A", new StrategyA());
strategyMap.put("B", new StrategyB());
strategyMap.put("C", new StrategyC());
}
public void process(String type) {
Strategy strategy = strategyMap.getOrDefault(type, () -> {});
strategy.execute();
}
}
通過策略模式,代碼結構更加清晰,擴展性更強.