将 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();
}
}
通过策略模式,代码结构更加清晰,扩展性更强.