多态是策略模式的底层必要支撑而非附加功能;Java通过接口或抽象类定义统一契约,运行时JVM动态绑定具体方法,结合canHandle自主判断与接口轻量设计实现开闭原则。

多态是策略模式能跑起来的底层支撑,不是附加功能,而是必要条件。Java 用接口或抽象类定义统一行为契约,不同策略实现各自逻辑,运行时由 JVM 动态绑定具体方法——这正是多态的核心机制。
接口定义统一入口,不暴露业务细节
策略接口只声明“做什么”,不规定“依据什么做”。比如:
- 写 void handle(TradeContext context),而不是 void handle(String type, BigDecimal amount)
- 把判断权交给策略自身,通过 boolean canHandle(TradeContext context) 自主决定是否响应
- 避免在接口里塞渠道名、状态码、金额阈值等易变字段,否则每加一个策略就得改接口,所有实现类集体报错
具体策略各干各的,互不干扰
每个策略类只专注一件事,不掺杂其他逻辑:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 微信支付策略:调用微信 SDK 下单,不处理支付宝验签
- 低额免密策略:检查金额<100 且用户已开通,不碰风控规则
- JSON 格式化策略:用 Jackson 序列化,不混入 XML 标签生成
- 新增策略只需新增类,不用动已有代码,符合开闭原则
上下文持有接口引用,靠多态自动路由
上下文类不 new 具体类型,只持有一个策略接口变量:
立即学习“Java免费学习笔记(深入)”;
- private PaymentStrategy strategy; —— 编译期只知道接口类型
- strategy.handle(context); —— 运行时 JVM 查实际对象类型,调对应实现
- 客户端切换策略,只需 context.setStrategy(new AlipayStrategy()),下一次调用就走新逻辑
- 没有 if-else 分发,没有 switch 匹配,全是多态调用
Spring 环境下让多态更省心
避免手动维护策略 Map 导致漏注册:
- 所有策略实现类加 @Service,不加 @Component(后者不参与类型扫描)
- 启动时用 applicationContext.getBeansOfType(PaymentStrategy.class) 拿全量实例
- 遍历调用 canHandle(context) 找到匹配的那个,再执行 handle()
- 策略实例轻量,初始化延迟到第一次 handle(),别在构造器里加载配置或连数据库

















