开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由 Bertrand Meyer 于 1988 年提
出,其定义如下:
开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的
情况下进行扩展。
在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
任何软件都需要面临一个很重要的问题,即它们的需求会随时间的推移而发生变化。当软件系统需要面对新的需求时,我
们应该尽量保证系统的设计框架是稳定的。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩
展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。随着软件规模越来越大,软
件寿命越来越长,软件维护成本越来越高,设计满足开闭原则的软件系统也变得越来越重要。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在 Java、C#等编程语言中,可以为系统定义
一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等
机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动,
只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
Sunny 软件公司开发的 CRM 系统可以显示各种类型的图表,如饼状图和柱状图等,为了支持多种图表显示方式,原始设计
方案如图 1 所示:
图 1初始设计方案结构图
在 ChartDisplay 类的 display()方法中存在如下代码片段:
[java]view plain copy
1. ......
2. if(type.equals("pie")){
3. PieChartchart=newPieChart();
4. chart.display();
5. }
6. elseif(type.equals("bar")){
7. BarChartchart=newBarChart();
8. chart.display();
9. }
10. ......
在该代码中,如果需要增加一个新的图表类,如折线图 LineChart,则需要修改 ChartDisplay 类的 display()方法的源代码,
增加新的判断逻辑,违反了开闭原则。
现对该系统进行重构,使之符合开闭原则。