
我们先看一下原始设计的问题所在ChartDisplay类里有一个display(String type)方法通过传入type来判断是显示饼状图PieChart还是柱状图BarChart。这种设计存在明显缺陷每次新增一种图表类型比如折线图、雷达图都必须修改ChartDisplay类的代码在display方法里增加新的判断分支。这直接违反了开闭原则Open-Closed Principle, OCP软件实体应当对扩展开放对修改关闭。二、重构思路用抽象和多态实现开闭原则开闭原则的核心实现方式就是抽象化定义接口 / 抽象类再让不同的具体实现类继承 / 实现它。我们的重构步骤如下1. 定义抽象图表接口 / 抽象类首先创建一个Chart抽象类或接口定义所有图表都必须实现的display()方法。java运行// 抽象图表类 public abstract class Chart { public abstract void display(); }2. 让具体图表类继承抽象类让PieChart、BarChart继承Chart类实现各自的display()方法java运行// 饼状图类 public class PieChart extends Chart { Override public void display() { System.out.println(显示饼状图); } } // 柱状图类 public class BarChart extends Chart { Override public void display() { System.out.println(显示柱状图); } }3. 改造ChartDisplay类ChartDisplay不再依赖具体的图表类型而是依赖抽象的Chart类通过多态调用display()方法java运行public class ChartDisplay { // 不再通过type判断而是直接接收Chart对象 public void display(Chart chart) { chart.display(); } }4. 客户端调用示例java运行public class Client { public static void main(String[] args) { ChartDisplay display new ChartDisplay(); // 显示饼状图 Chart pie new PieChart(); display.display(pie); // 显示柱状图 Chart bar new BarChart(); display.display(bar); } }三、扩展场景新增图表类型时的变化当我们需要新增 “折线图LineChart” 时只需要做两件事新增LineChart类继承Chart并实现display()方法java运行public class LineChart extends Chart { Override public void display() { System.out.println(显示折线图); } }客户端直接使用新的图表类无需修改ChartDisplayjava运行// 新增折线图调用 Chart line new LineChart(); display.display(line);✅ 可以看到新增功能时我们没有修改任何已有代码完全通过扩展实现了需求完美符合开闭原则。四、重构前后对比表格维度原始设计重构后设计新增图表时必须修改ChartDisplay类的display方法增加判断分支只需新增一个继承Chart的类无需修改已有代码耦合度ChartDisplay与所有具体图表类强耦合ChartDisplay仅依赖抽象Chart与具体实现解耦扩展性差每次扩展都要修改核心类强扩展时不影响已有代码维护成本高修改可能引入新的 bug低新增功能对已有逻辑无影响五、开闭原则的核心要点抽象是关键通过抽象类 / 接口定义稳定的契约具体实现可以自由扩展。对扩展开放新需求通过新增类来实现而不是修改旧代码。对修改关闭已有的、稳定的业务代码不应该被频繁修改避免引入风险。依赖抽象而非具体高层模块如ChartDisplay只依赖抽象不依赖具体实现类。