策略模式解决的核心问题是什么?
策略模式主要解决的是多种算法或行为的选择问题,特别是在运行时需要根据不同条件选择不同行为的场景。
策略模式解决的核心问题:
1. 消除复杂的条件判断
问题:代码中存在大量的 if-else 或 switch-case 语句
// 优化前 - 复杂的条件判断
if (type == "A") {// 算法A
} else if (type == "B") {// 算法B
} else if (type == "C") {// 算法C
}
解决:将每个算法封装成独立的策略类
// 优化后 - 策略模式
Strategy strategy = StrategyFactory.getStrategy(type);
strategy.execute();
2. 开闭原则(对扩展开放,对修改关闭)
问题:新增算法需要修改原有代码
// 需要修改这个if-else块
if (type == "D") { // 新增// 算法D
}
解决:新增算法只需添加新的策略类,无需修改现有代码
// 只需新增DStrategy类,无需修改工厂或其他策略
public class DStrategy implements Strategy {public void execute() {// 算法D}
}
3. 算法复用和组合
问题:相似的算法逻辑散落在各处,难以复用
解决:算法被封装在策略类中,可以在不同上下文中复用
策略模式的典型应用场景:
1. 支付方式选择
// 不同支付策略
PaymentStrategy alipayStrategy = new AlipayStrategy();
PaymentStrategy wechatStrategy = new WechatStrategy();
PaymentStrategy bankStrategy = new BankStrategy();// 根据用户选择使用不同策略
context.setPaymentStrategy(alipayStrategy);
context.pay(amount);
2. 排序算法选择
// 不同排序策略
SortStrategy quickSort = new QuickSortStrategy();
SortStrategy mergeSort = new MergeSortStrategy();
SortStrategy bubbleSort = new BubbleSortStrategy();// 根据数据特点选择排序策略
sorter.setStrategy(quickSort);
sorter.sort(largeData);
3. 折扣计算
// 不同折扣策略
DiscountStrategy normal = new NormalDiscount();
DiscountStrategy vip = new VipDiscount();
DiscountStrategy festival = new FestivalDiscount();// 根据用户类型和活动选择策略
calculator.setDiscountStrategy(vip);
double finalPrice = calculator.calculate(price);
策略模式的优点:
- 易于扩展:新增策略无需修改现有代码
- 避免重复:相似的算法逻辑被封装复用
- 提高可读性:消除了复杂的条件分支
- 便于测试:每个策略可以独立测试
- 运行时切换:可以在运行时动态切换算法
策略模式的缺点:
- 类数量增加:每个策略都需要一个类
- 客户端需要了解策略:客户端需要知道有哪些策略可用
- 增加系统复杂度:对于简单场景可能过度设计
总结:
策略模式最适合算法经常变化、需要多种处理方式、且这些方式相对独立的场景。对于您之前的审批排序代码,如果审批规则经常变化或需要支持多种不同的审批流程,策略模式是一个很好的选择。如果规则相对固定,简单的方法拆分可能更合适。
