一、定义
开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。
二、特点
OCP中所说的软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。
三、案例
件公司开发的CRM系统可以显示各种类型的图表,如饼状图和柱状图等。
(一)初始方案
当在ChartDisplay类需要展示图标的时候,通过type进行判断,根据不同的类型使用不同的图标进行展示,代码如下:
if (type.equals("pie")) {
PieChart chart = new PieChart();
chart.display();
}else if (type.equals("bar")) {
BarChart chart = new BarChart();
chart.display();
}
存在问题
如果需要增加一个新的图表类,如折线图LineChart,则需要修改ChartDisplay类的display()方法的源代码,增加新的判断逻辑,违反了开闭原则。
(二)OCP优化
由于在ChartDisplay类的display()方法中针对每一个图表类编程,因此增加新的图表类不得不修改源代码。可以通过抽象化的方式对系统进行重构,使之增加新的图表类时无须修改源代码,满足开闭原则。
重构后架构如下:
可以看到,引入了抽象图表类AbstractChart,且ChartDisplay针对抽象图表类进行编程,并通过setChart()方法由客户端来设置实例化的具体图表对象,在ChartDisplay的display()方法中调用chart对象的display()方法显示图表。如果需要增加一种新的图表,如折线图LineChart,只需要将LineChart也作为AbstractChart的子类,在客户端向ChartDisplay中注入一个LineChart对象即可,无须修改现有类库的源代码。