news 2026/6/11 11:44:06

重构 CRM 图表系统:用开闭原则打造可扩展的图表架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
重构 CRM 图表系统:用开闭原则打造可扩展的图表架构

我们先看一下原始设计的问题所在:

  • 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. 让具体图表类继承抽象类

PieChartBarChart继承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)” 时,只需要做两件事:

  1. 新增LineChart类,继承Chart并实现display()方法:

java

运行

public class LineChart extends Chart { @Override public void display() { System.out.println("显示折线图"); } }
  1. 客户端直接使用新的图表类,无需修改ChartDisplay

java

运行

// 新增折线图调用 Chart line = new LineChart(); display.display(line);

✅ 可以看到:新增功能时,我们没有修改任何已有代码,完全通过扩展实现了需求,完美符合开闭原则。


四、重构前后对比

表格

维度原始设计重构后设计
新增图表时必须修改ChartDisplay类的display方法,增加判断分支只需新增一个继承Chart的类,无需修改已有代码
耦合度ChartDisplay与所有具体图表类强耦合ChartDisplay仅依赖抽象Chart,与具体实现解耦
扩展性差,每次扩展都要修改核心类强,扩展时不影响已有代码
维护成本高,修改可能引入新的 bug低,新增功能对已有逻辑无影响

五、开闭原则的核心要点

  1. 抽象是关键:通过抽象类 / 接口定义稳定的契约,具体实现可以自由扩展。
  2. 对扩展开放:新需求通过新增类来实现,而不是修改旧代码。
  3. 对修改关闭:已有的、稳定的业务代码不应该被频繁修改,避免引入风险。
  4. 依赖抽象,而非具体:高层模块(如ChartDisplay)只依赖抽象,不依赖具体实现类。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 11:43:59

115proxy-for-kodi:打破云端与本地界限,让Kodi直接播放115网盘视频

115proxy-for-kodi:打破云端与本地界限,让Kodi直接播放115网盘视频 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 你是否曾为下载大型视频文件而等待数小时&#…

作者头像 李华
网站建设 2026/6/11 11:43:25

北大ICS位运算实验包:bits.c源码+实验指南PDF(含约束说明)

本文还有配套的精品资源,点击获取 简介:北京大学计算机系统导论(ICS)课程Lab1实验材料,主打C语言位级编程训练。核心是bits.c文件,实现13个纯位运算函数,全部面向32位有符号整数,…

作者头像 李华
网站建设 2026/6/11 11:43:22

从零设计一个能跑排序的CPU:用Logisim仿真单总线结构与微程序控制

从零设计一个能跑排序的CPU:用Logisim仿真单总线结构与微程序控制在计算机体系结构的学习中,真正理解CPU工作原理的最佳方式莫过于亲手设计一个。本文将带你从零开始,使用Logisim仿真工具构建一个能够执行排序算法的单总线结构CPU&#xff0c…

作者头像 李华