java策略模式通过接口多态实现“做什么”与“怎么做”分离:定义统一策略接口(如paymentstrategy)、各实现类封装逻辑并实现canhandle()识别自身适用性、spring自动注册所有@service策略、主流程遍历匹配执行,支持泛型和lambda简化实现。

Java 中用接口多态实现策略模式,核心是把“做什么”和“怎么做”彻底分开——接口定义统一行为契约,多个实现类各自封装逻辑,运行时由 JVM 自动绑定具体实现,调用方完全不关心类型细节。
定义清晰稳定的策略接口
接口只声明行为,不暴露判断依据或业务细节。比如支付场景,不要写 handle(String channel, BigDecimal amount),而应统一入参为上下文对象:
- 定义
interface PaymentStrategy { void execute(PaymentContext context); } - 所有实现类(
WechatPayStrategy、AlipayStrategy)都实现这个方法 - 方法签名必须严格一致:参数类型、数量、返回值都不能变,否则多态无法成立
让策略自己决定是否适用
避免外部用 if-else 或 switch 判断该选哪个策略。把识别逻辑下沉到策略内部:
- 在接口中增加
boolean canHandle(PaymentContext context)方法 - 每个策略自行判断:比如
WechatPayStrategy检查context.getChannel() == "wechat" - 主流程只需遍历所有策略,找到第一个
canHandle()返回 true 的实例,再调用execute()
自动注册与动态路由
别手动维护 Map 或硬编码 new 实例,利用 Spring 容器能力确保不漏注册:
- 所有策略实现类标注
@Service(不是@Component) - 启动时通过
applicationContext.getBeansOfType(PaymentStrategy.class)获取全部实例 - 缓存到
List<paymentstrategy></paymentstrategy>,每次请求按canHandle()匹配,无需修改已有代码
支持泛型与行为即参数
当输入输出类型多样时,用泛型增强复用性;对简单逻辑,可用 Lambda 替代实现类:
- 定义
interface Strategy<t r> { R apply(T input); }</t> - 新增策略只需写
Strategy<order result> riskCheck = o -> {...};</order> - Lambda 编译后仍是接口实现,底层仍靠多态分派,只是省去类文件
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











