Java继承中如何实现开闭原则
通过抽象接口定义行为契约,利用继承与多态实现扩展,配合依赖倒置和工厂模式,使系统在不修改原有代码的前提下支持新增功能,如新增图形类型只需实现Shape接口并扩展工厂,无需改动AreaCalculator等现有逻辑。
通过抽象接口定义行为契约,利用继承与多态实现扩展,配合依赖倒置和工厂模式,使系统在不修改原有代码的前提下支持新增功能,如新增图形类型只需实现Shape接口并扩展工厂,无需改动AreaCalculator等现有逻辑。

在Java继承结构中实现开闭原则(Open/Closed Principle),关键在于让系统对扩展开放、对修改关闭。也就是说,当需求变化时,应通过添加新代码来扩展功能,而不是修改已有的稳定代码。以下是具体实现方式。
使用抽象基类或接口定义契约
通过定义抽象类或接口来封装行为的通用结构,将可变部分延迟到子类实现。
例如,定义一个图形绘制接口:
interface Shape {
double area();
}
class Rectangle implements Shape {
private double width, height;
public double area() { return width * height; }
}
class Circle implements Shape {
private double radius;
public double area() { return Math.PI * radius * radius; }
}
如果需要新增三角形,只需新增Triangle类实现Shape接口,无需修改已有代码。这样就实现了对扩展开放、对修改关闭。
依赖倒置减少耦合
高层模块不应依赖低层模块,两者都应依赖抽象。这样新增子类不会影响调用方。
例如,计算所有图形总面积的方法:
class AreaCalculator {
public double totalArea(List shapes) {
return shapes.stream().mapToDouble(Shape::area).sum();
}
}
这个方法只依赖Shape接口,无论后续添加多少种图形,都不需要修改该方法。
利用多态支持运行时扩展
通过继承和重写,不同子类可以提供各自的行为实现,而调用逻辑保持不变。
比如增加新的图形类型:
class Triangle implements Shape {
private double base, height;
public double area() { return 0.5 * base * height; }
}
只要它实现了Shape接口,就能被AreaCalculator正确处理,完全不需要改动原有逻辑。
结合工厂模式动态创建对象
为了避免在客户端硬编码new具体类,可以引入工厂来创建对象,进一步隔离变化。
例如:
class ShapeFactory {
public static Shape create(String type, double... params) {
switch (type) {
case "circle": return new Circle(params[0]);
case "rectangle": return new Rectangle(params[0], params[1]);
default: throw new IllegalArgumentException("Unknown type");
}
}
}
当新增图形类型时,只需扩展工厂逻辑(或使用注册机制),而不影响使用方。
基本上就这些。核心是用抽象隔离变化,通过继承扩展行为,配合多态和依赖抽象,使系统更灵活、更易维护。不复杂但容易忽略的是:不要为了继承而继承,重点是围绕“不变”与“变”做合理抽象。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















