定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。
核心思想
- 定义: 将一组算法/策略封装为独立类,但它们可动态替换,解耦算法与使用对象。
- 结构:
Strategy
: 策略接口(定义公共方法)
ConcreteStrategy
: 具体策略类(实现不同算法)
Context
: 上下文类(持有策略接口引用,调用策略方法)
应用场景
- 支付系统: 支持多种支付方式(支付宝、微信、银联)。
- 促销活动: 不同折扣策略(满减、打折、赠品)。
- 路由算法: 动态切换最短路径、最低成本等计算策略。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public interface PaymentStrategy { void pay(int amount); }
public class Alipay implements PaymentStrategy { public void pay(int amount) { System.out.println("支付宝支付: " + amount); } }
public class WeChatPay implements PaymentStrategy { public void pay(int amount) { System.out.println("微信支付: " + amount); } }
public class ShoppingCart { private PaymentStrategy strategy;
public void setPaymentStrategy(PaymentStrategy strategy) { this.strategy = strategy; }
public void checkout(int amount) { strategy.pay(amount); } }
ShoppingCart cart = new ShoppingCart(); cart.setPaymentStrategy(new Alipay()); cart.checkout(100);
|
注意事项
- 策略类数量膨胀: 策略过多时需要多个策略类,可能会增加系统复杂度。
- 如果策略过多,建议结合工厂模式或配置文件来动态选择策略。