策略模式(Strategy Pattern)

定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。

核心思想

  • 定义: 将一组算法/策略封装为独立类,但它们可动态替换,解耦算法与使用对象。
  • 结构:
    • 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
// 1. 定义策略接口
public interface PaymentStrategy {
void pay(int amount);
}

// 2. 实现具体策略
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);
}
}

// 3. 上下文使用策略
public class ShoppingCart {
private PaymentStrategy strategy;

public void setPaymentStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}

public void checkout(int amount) {
strategy.pay(amount);
}
}

// 4. 调用示例
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new Alipay());
cart.checkout(100); // 输出:支付宝支付: 100

注意事项

  • 策略类数量膨胀: 策略过多时需要多个策略类,可能会增加系统复杂度。
  • 如果策略过多,建议结合工厂模式或配置文件来动态选择策略。