设计模式之策略模式:让你的代码灵活应对不同的算法 | 京东云技术团队

设计模式之策略模式:让你的代码灵活应对不同的算法 | 京东云技术团队
最新回答
错过是一种遗憾

2023-06-09 17:15:02

策略模式是一种行为型设计模式,通过将不同算法封装为独立策略类,实现运行时动态切换算法行为,提升代码灵活性与可维护性。

核心概念解析
  1. 角色构成

    上下文(Context):持有策略对象引用,通过接口调用算法。如ShoppingCart类通过setPaymentStrategy动态切换支付方式。

    策略接口(Strategy):定义算法公共接口(如PaymentStrategy.pay()),确保策略类行为一致。

    具体策略(ConcreteStrategy):实现接口的具体算法(如CreditCardPaymentStrategy)。

  2. 与传统实现的对比

    传统问题:使用if-else硬编码算法(如支付方式判断),新增算法需修改原有代码,违反开闭原则

    策略模式优势:新增算法只需扩展新策略类(如WeChatPaymentStrategy),无需修改上下文逻辑,符合开闭原则单一职责原则

典型应用场景
  1. 支付系统扩展

    问题:电商需支持多种支付方式(信用卡、支付宝、微信等),传统if-else会导致代码臃肿。

    策略模式方案

    // 策略接口public interface PaymentStrategy { void pay(double amount); }// 具体策略public class AlipayStrategy implements PaymentStrategy { public void pay(double amount) { System.out.println("支付宝支付:" + amount); }}// 上下文动态切换ShoppingCart cart = new ShoppingCart();cart.setPaymentStrategy(new AlipayStrategy());cart.checkout(99.9);

    扩展性:新增抖音支付只需添加DouyinPaymentStrategy类,无需改动现有代码。

  2. 计算器算法优化

    问题:传统if-else实现加减乘除难以扩展(如取余运算)。

    策略模式方案

    // 策略接口public interface OperationStrategy { int calculate(int a, int b); }// 具体策略public class AddStrategy implements OperationStrategy { public int calculate(int a, int b) { return a + b; }}// 上下文public class Calculator { private OperationStrategy strategy; public void setStrategy(OperationStrategy s) { this.strategy = s; } public int execute(int a, int b) { return strategy.calculate(a, b); }}// 使用示例Calculator calc = new Calculator();calc.setStrategy(new AddStrategy());System.out.println(calc.execute(10, 5)); // 输出15

    扩展性:新增取余运算只需实现ModuloStrategy类。

策略模式的核心价值
  1. 解耦算法与使用逻辑:上下文无需关心具体算法实现,只需通过接口调用。
  2. 动态行为切换:运行时通过设置不同策略对象改变行为(如支付方式切换)。
  3. 符合设计原则

    开闭原则:新增算法通过扩展实现,无需修改原有代码。

    单一职责原则:每个策略类仅关注一种算法实现。

注意事项
  • 策略类数量管理:若策略变体过多,可结合工厂模式动态创建策略对象。
  • 上下文复杂度:简单场景可能增加类数量,需权衡是否过度设计。
总结

策略模式通过将算法封装为独立对象,实现了行为与上下文的解耦,特别适用于需要动态切换算法频繁扩展算法变体的场景。在支付系统、计算器、游戏AI等场景中,策略模式能显著提升代码的可维护性和扩展性,是面向对象设计中应对算法多样性的重要工具。