【设计模式】策略模式实战:用更优雅的方式切换支付方式
·
📝 Java 设计模式之——策略模式(Strategy Pattern)实战笔记
有时候,写代码最怕的不是 bug,而是看着自己写的几百行
if-else,突然陷入人生怀疑…
1. 为什么会想到策略模式?
Java 项目写久了,肯定会遇到这种场景:
- 系统有一大堆类似的功能实现,但差别在一些细节上
- 功能会不断新增(比如老板今天说要加微信支付,明天又来一个银联支付)
- 你一开始写得很爽,后来
if-else越写越多,代码一摸就是一长串条件判断 - 改一个地方,全局都要回归测试,生怕改挂了
这种情况… 说人话就是:变化和不变化的东西全揉在一锅粥里了。
想优雅一点?这就是策略模式该出场的时机。
2. 策略模式是啥?
官方说法:定义一组算法,将它们封装起来,使它们可以互相替换,且不影响使用算法的用户。
说人话:
就是把一堆“做事的方式”(策略)都单独封装成类,什么时候用哪个策略,你在运行时自己选就行。
这样:
- 你不用到处加
if-else分支 - 策略可以随意扩展、不影响原来的业务逻辑
- 想切换就换,零侵入
3. 简单 UML 示意
不用背,理解就好👇
Context(环境) —— 持有一个策略接口(可替换)
Strategy(策略接口) —— 定义要做的事情
ConcreteStrategyA/B/... —— 实际做事的人(多种方式)
4. 实战:支付场景改造
场景:
项目里有支付功能,现在支持 支付宝、微信
需求改造方向:
- 策略模式封装不同支付方式
- 以后加京东、银联,甚至“先交人情分”支付方式,都不动主要业务逻辑
💻 代码示例
// 策略接口
public interface PaymentStrategy {
void pay(int amount);
}
// 支付宝策略
public class AliPayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("💰 使用支付宝支付:" + amount + " 元");
}
}
// 微信策略
public class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("💰 使用微信支付:" + amount + " 元");
}
}
// 环境类
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void payMoney(int amount) {
strategy.pay(amount);
}
}
// 测试
public class Main {
public static void main(String[] args) {
PaymentContext p1 = new PaymentContext(new AliPayStrategy());
p1.payMoney(100);
PaymentContext p2 = new PaymentContext(new WeChatPayStrategy());
p2.payMoney(200);
}
}
运行结果
💰 使用支付宝支付:100 元
💰 使用微信支付:200 元
不改 PaymentContext,就能轻松换支付方式,这就是策略模式的精髓。
5. 使用心得(个人感受版)
我认为策略模式的最大优势其实不是“消除 if-else”,而是让变化的东西不再到处乱跑。
在我自己的几个项目里:
- 新加一个策略类就能启用新功能,根本不动旧代码
- 策略切换非常灵活,测试也简单,可以单独对某个策略做单元测试
当然,我也踩过坑:
- 策略类很多的时候,类文件会爆炸(几十上百个策略类找得头大)
- 客户端代码如果要“自己选策略”,有时候业务会很乱,所以我后来配合工厂模式或配置驱动来管理
6. 什么时候用策略模式?
适合的场景:
- 功能有很多种实现方式
- 实现方式会一直变化、扩展
- 需要运行时灵活切换
不太适合:
- 只有一两种实现方式,而且几乎不变(搞那么多类纯属找事)
7. 总结
策略模式在代码重构的时候特别好用,它能帮我们把业务逻辑分成两部分:
- 不变的部分:上下文环境框架
- 可变的部分:各种具体策略实现
我的建议是:
- 如果分支逻辑过多且会变动,首选策略模式
- 策略选择逻辑,尽量不要放到业务代码里 → 用配置、工厂模式、依赖注入去做
💬 最后一句:
策略模式并不是万能的,但它会让你以后改需求的时候少掉很多头发。
更多推荐



所有评论(0)