多态是java实现开闭原则最直接方式,核心是调用方依赖抽象类型且运行时自动切换行为;通过接口定义契约、工厂或容器解耦对象创建,新增功能只需加类而不改老代码。

多态是 Java 落地开闭原则最直接、最自然的方式。核心不是“用了继承或 implements”,而是调用方是否只依赖抽象类型,运行时能否自动切换行为——新增功能靠加类,不改老代码。
用接口定义统一契约,把变化关进多态的笼子
接口只声明能力,不带实现、不存状态,天然适合隔离变化。
- 定义 Notifier 接口,仅含
send(String content) - 微信、短信、邮件各自实现该接口,彼此完全解耦
- 业务类如 OrderService 只持有
Notifier类型引用,调用send()即可 - 要加站内信?只需新增 InternalNotifier 类实现接口,其余代码零改动
运行时绑定才是多态生效的前提
如果还在方法里写 new SmsNotifier() 或用 if (type == "sms") 分支判断,多态就只是摆设——扩展时仍得动调用逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对象创建交给工厂类或 Spring 容器,比如传入配置项
"wechat",返回对应实例 - 客户端代码永远操作接口类型,具体是谁干活,由实际注入的对象决定
- 测试时可直接注入 Mock 实现,不依赖真实渠道,也无需改任何业务逻辑
优先选接口,慎用抽象类
接口更轻量、更安全:没有字段、没有默认实现,每个实现类必须明确表达自己怎么做事。
- 抽象类容易悄悄引入共享状态或默认逻辑,新子类可能被旧行为拖累
- 若真要用抽象类,只放稳定骨架,可变部分全用
abstract方法留空 - 例如日志模板:
log()是final流程,doLog()必须子类重写
一眼识别 OCP 是否被破坏
不用看设计文档,翻代码就能判断:
- 方法里出现
if (type.equals("xxx"))或新增case?违反 OCP -
process()方法体被修改来支持新类型?违反 OCP - 参数里带
PaymentType type,再用分支分发?坏味道 - 正确做法是:由子类各自实现,调用方无感知,完全不关心类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










