核心是用抽象隔离变化,新增功能不改老代码只加新类;定义稳定接口(如Shape、PaymentStrategy)提取共性行为,具体实现类面向接口编程,通过依赖注入解耦,运行时动态替换实现。

核心是用抽象隔离变化,新增功能不改老代码,只加新类。
定义稳定接口或抽象类
把共性行为提取成接口或抽象类,作为扩展的契约。所有具体实现都面向它编程,而不是面向具体类型。
- 比如图形系统,定义 Shape 接口,含
area()方法 - 支付系统定义 PaymentStrategy 接口,含
pay()方法 - 避免用 if-else 或 switch 判断类型,那会把变化逻辑硬编码进调用方
每个新功能封装为独立实现类
每增加一种图形、一种支付方式、一种按钮行为,就写一个新类,实现前述接口。
-
Circle、Rectangle 分别实现
Shape -
Alipay、WeChatPay 分别实现
PaymentStrategy - 添加三角形?只需新增 Triangle 类,不碰
AreaCalculator或已有图形类
依赖注入代替硬编码创建
调用方(如计算器、订单服务)不自己 new 具体类,而是通过构造函数、setter 或工厂接收实现对象。
立即学习“Java免费学习笔记(深入)”;
-
AreaCalculator 只持有
Shape引用,计算时调用shape.area() -
PaymentService 构造时传入
PaymentStrategy,执行时调用strategy.pay() - 运行时决定用哪个实现,扩展时只需替换参数,不改业务逻辑类
避免在已有类里增删分支逻辑
这是最常见的违反点:在原有方法中加 if/switch 处理新类型。
- ❌ 错误:在
GraphicEditor.drawShape()里加if (type == 3) drawTriangle() - ✅ 正确:让
Triangle实现Shape,drawShape(Shape s)一行代码s.draw()即可 - 修改已有方法 = 打破“对修改关闭”;加类 = 满足“对扩展开放”


















