策略模式的核心价值是通过替换策略实例而非修改代码来变更对象行为;需定义聚焦“做什么”的稳定接口,各具体策略专注单一职责,上下文仅持引用并委托执行,业务层按需装配切换。

策略模式的核心价值,就是让对象行为的变更不依赖代码修改,而是靠替换策略实例来完成。只要接口契约稳定,新增、删减或调整算法逻辑,都不会波及使用方。
定义清晰稳定的策略接口
这是整个模式的地基。接口要聚焦“做什么”,不暴露“怎么做”。比如支付场景中,只声明 pay(double amount) 和 getMethod(),不规定是否要验签、是否走异步回调。所有具体策略都必须实现这两个方法,才能被上下文统一调用。
- 接口方法尽量少而通用,避免频繁修改接口导致所有策略类被迫改动
- 可配合默认方法提供公共基础逻辑(如日志埋点、参数校验),减少重复代码
- 若策略需携带配置,建议通过构造函数注入,而非在接口中加一堆 setter
每个具体策略专注单一职责
一个策略类只解决一个问题。支付宝策略管好支付宝支付流程,微信策略只处理微信侧签名与回调,信用卡策略专注卡号加密与银行网关对接。它们彼此隔离,互不影响。
- 新增一种支付方式?只需新增一个类,实现策略接口,其他代码零改动
- 修复微信支付 bug?只改 WechatStrategy,不会误伤支付宝逻辑
- 策略内部可自由使用工具类、远程调用、缓存,只要最终符合接口约定即可
上下文只持引用,不参与决策
上下文类(如 PaymentContext)本质是个“调度员”:它保存当前策略的引用,提供设置入口,执行时直接委托。它不知道也不该知道哪个策略在运行,更不写 if-else 判断该走哪条路。
- 避免在上下文中做策略选择逻辑(如根据用户等级选策略),这部分应交由外部工厂或规则引擎
- 支持运行时多次 setStrategy(),切换后下一次 execute() 就自动生效
- 可增加简单空值防护,比如执行前检查 strategy 是否为 null,抛明确异常
业务层按需装配与切换
真正决定用哪个策略的地方,在业务代码里。下单时读用户偏好选微信,退款时强制走原路,风控拦截时临时切到模拟策略——这些决策由业务语义驱动,不是硬编码在模型里。
- 可通过配置中心动态加载策略类名,配合反射或 Spring 的 Bean 查找实现配置化切换
- 结合枚举定义策略类型(PAYMENT_WECHAT, PAYMENT_ALIPAY),便于前端传参和日志追踪
- 单元测试时可轻松注入 Mock 策略,验证上下文行为是否符合预期,无需启动真实支付通道

















