🎭 一、漫画开场:小贾的"支付之痛"
小贾是一个刚接手电商系统的新晋 Java 工程师。某天,产品经理跑来:"咱们要支持微信、支付宝、银联、京东支付、Apple Pay,而且未来可能还要加数字货币!"
他翻开支付模块,看到这样的代码:
java
public void pay(String payType, double amount) {
if ("wechat".equals(payType)) {
// 微信支付逻辑
} else if ("alipay".equals(payType)) {
// 支付宝逻辑
} else if ("unionpay".equals(payType)) {
// 银联逻辑
}
// ......未来还要加更多 if-else
}public void pay(String payType, double amount) {
if ("wechat".equals(payType)) {
// 微信支付逻辑
} else if ("alipay".equals(payType)) {
// 支付宝逻辑
} else if ("unionpay".equals(payType)) {
// 银联逻辑
}
// ......未来还要加更多 if-else
}
"这哪是代码,这是技术债炸弹!"小贾哀嚎。
这时,神秘高人策略大师·阿策 闪现:"年轻人,你需要------策略模式(Strategy Pattern)!"
🔍 二、策略模式:定义与核心思想
✅ GoF 定义 :
定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。策略模式让算法的变化独立于使用它的客户端。
✅ 核心思想 :
将"变"与"不变"分离。
- 不变:支付流程(下单 → 选择方式 → 调用支付 → 返回结果)
- 变:具体支付实现(微信、支付宝等)
✅ 属于行为型设计模式 ,软考高级架构师考试中属于高频考点(尤其在"系统设计"和"代码重构"题型中)。
🏗️ 三、策略模式的三大角色(UML + 代码实现)
1. UML 类图(建议保存)

2. 完整 Java 代码实现(可直接复制运行)
java
// 1. 策略接口:支付行为抽象
public interface PaymentStrategy {
void pay(double amount);
}
// 2. 具体策略实现
public class WeChatPay implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("[微信支付] 扫码完成,支付金额:" + amount + " 元");
}
}
public class Alipay implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("[支付宝] 指纹验证通过,支付金额:" + amount + " 元");
}
}
public class UnionPay implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("[银联支付] 刷卡成功,支付金额:" + amount + " 元");
}
}
// 3. 上下文:持有策略并执行
public class PaymentContext {
private PaymentStrategy strategy;
public void setPaymentStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(double amount) {
if (strategy == null) {
throw new IllegalStateException("未设置支付策略!");
}
strategy.pay(amount);
}
}
3. 客户端调用示例
java
public class Main {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 用户选择微信支付
context.setPaymentStrategy(new WeChatPay());
context.executePayment(99.9);
// 用户切换为支付宝
context.setPaymentStrategy(new Alipay());
context.executePayment(199.0);
}
}
✅ 输出:
微信支付\] 扫码完成,支付金额:99.9 元
\[支付宝\] 指纹验证通过,支付金额:199.0 元
### 🚀 四、进阶实战:策略 + 工厂 + 注解,打造企业级支付引擎
实际项目中,我们不会手动 `new WeChatPay()`,而是用**策略工厂 + 注解**自动注册,提升扩展性。
#### 1. 定义支付类型枚举
```java
public enum PayType {
WECHAT, ALIPAY, UNIONPAY
}
```
#### 2. 添加策略标识注解
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PayStrategy {
PayType value();
}
```
#### 3. 策略类加上注解
```java
@PayStrategy(PayType.WECHAT)
public class WeChatPay implements PaymentStrategy { ... }
@PayStrategy(PayType.ALIPAY)
public class Alipay implements PaymentStrategy { ... }
```
#### 4. 策略工厂(Spring 环境下可用 ApplicationContext 获取 Bean)
```java
@Component
public class PaymentStrategyFactory {
private final Map