Java多态实现优雅扩展的关键是接口定义契约、新增类不改老代码:Payment等接口声明“做什么”,AlipayPayment等实现类专注“怎么做”,Spring自动注入+策略上下文动态选型,抽象类封装共用流程,避免static/final/private导致多态失效。

Java 中多态实现优雅扩展,关键不是堆继承、也不是硬写 if-else,而是让新增功能像“插件”一样加进去——老代码不动,新逻辑可插拔。
用接口定义稳定契约,新增类型只加类不改调用方
把行为抽象成接口,比如 Payment、Exporter、Notifier,只声明“做什么”,不规定“怎么做”。已有 AlipayPayment 和 WechatPayment,后续加 ApplePayPayment,只需实现接口,所有调用 Payment.pay() 的地方完全不用动。
- 接口方法必须是 public、非 static、非 final、非 private
- 避免在调用侧写 if (type.equals("alipay")) 这类硬编码分支
- Spring 项目中,所有实现类加 @Service,就能被自动注入到 List 或 Map 容器里
结合策略上下文,动态选型不暴露细节
调用方不该关心“哪个实现类被选中”,只管发指令。可以封装一个 StrategyContext:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 注入 Map<String, Payment>,key 是渠道标识(如 "alipay")
- context.execute("alipay", amount) 内部按 key 查找并执行
- 后续加新支付方式,只要注册进 Spring 容器,策略上下文自动识别
抽象类封装共用流程,子类专注差异逻辑
当多个实现共享固定步骤(如校验→记录→执行→回调),把这些稳定逻辑提到抽象类里:
立即学习“Java免费学习笔记(深入)”;
- 定义 abstract class BaseExportService,含 export(data) 模板方法
- 模板方法内调用 preCheck()(已实现)、doExport()(抽象,由子类实现)、postNotify()(已实现)
- ExcelExportService 和 PdfExportService 只需重写 doExport(),不重复写日志和状态更新
注意多态失效的常见坑
写了子类不代表多态就起作用。以下情况会绕过动态绑定:
- 方法被 static、final 或 private 修饰
- 调用时用了 new XxxServiceImpl() 而非依赖注入或工厂获取
- 方法签名不一致(比如子类参数类型是父类的子类但未协变,或返回值不兼容)
- 接口默认方法没被正确覆盖,又没提供业务级 fallback

















