2023-06-09 17:15:02
策略模式是一种行为型设计模式,通过将不同算法封装为独立策略类,实现运行时动态切换算法行为,提升代码灵活性与可维护性。
核心概念解析角色构成
上下文(Context):持有策略对象引用,通过接口调用算法。如ShoppingCart类通过setPaymentStrategy动态切换支付方式。
策略接口(Strategy):定义算法公共接口(如PaymentStrategy.pay()),确保策略类行为一致。
具体策略(ConcreteStrategy):实现接口的具体算法(如CreditCardPaymentStrategy)。
与传统实现的对比
传统问题:使用if-else硬编码算法(如支付方式判断),新增算法需修改原有代码,违反开闭原则。
策略模式优势:新增算法只需扩展新策略类(如WeChatPaymentStrategy),无需修改上下文逻辑,符合开闭原则和单一职责原则。
支付系统扩展
问题:电商需支持多种支付方式(信用卡、支付宝、微信等),传统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类,无需改动现有代码。
计算器算法优化
问题:传统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类。
开闭原则:新增算法通过扩展实现,无需修改原有代码。
单一职责原则:每个策略类仅关注一种算法实现。
策略模式通过将算法封装为独立对象,实现了行为与上下文的解耦,特别适用于需要动态切换算法或频繁扩展算法变体的场景。在支付系统、计算器、游戏AI等场景中,策略模式能显著提升代码的可维护性和扩展性,是面向对象设计中应对算法多样性的重要工具。