开闭原则

【PPT视频讲解链接】:https://www.bilibili.com/video/BV1D7411y7QA/      (不知道为啥声音有点小,可能需要视频右键音效增强一下

♦开闭原则是可复用设计的第一块基石,最重要的面向对象设计原则,由Bertrand Meyer1988年提出。

开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

(软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。)

                       

抽象化是开闭原则的关键。C#中可以为系统定义一个相对稳定的抽象层(接口、抽象类),而将不同的实现行为移至具体的实现层中完成。

举例说明:

 Sunny软件公司开发的CRM系统可以显示各种类型的图表,如饼状图和柱状图等,为了支持多种图表显示方式,原始设计方案如图所示:

在ChartDisplay类的display()方法中存在如下代码片段:

复制代码
......
if (type.equals("pie")) {
PieChart chart = new PieChart();
chart.display();
}
else if (type.equals("bar")) {
BarChart chart = new BarChart();
chart.display();
}
......
复制代码

在该代码中,如果需要增加一个新的图表类,如折线图LineChart,则需要修改ChartDisplay类的display()方法的源代码,增加新的判断逻辑,违反了开闭原则。

      现对该系统进行重构,使之符合开闭原则。

在本实例中,由于在ChartDisplay类的display()方法中针对每一个图表类编程,因此增加新的图表类不得不修改源代码。可以通过抽象化的方式对系统进行重构,使之增加新的图表类时无须修改源代码,满足开闭原则。具体做法如下:

      (1) 增加一个抽象图表类AbstractChart,将各种具体图表类作为其子类;

      (2)  ChartDisplay类针对抽象图表类进行编程,由客户端来决定使用哪种具体图表。

      重构后结构如图所示:

在图中,我们引入了抽象图表类AbstractChart,且ChartDisplay针对抽象图表类进行编程,并通过setChart()方法由客户端来设置实例化的具体图表对象,在ChartDisplay的display()方法中调用chart对象的display()方法显示图表。如果需要增加一种新的图表,如折线图LineChart,只需要将LineChart也作为AbstractChart的子类,在客户端向ChartDisplay中注入一个LineChart对象即可,无须修改现有类库的源代码。

♦开闭原则是面向对象程序设计的终极目标,它可以使软件实体具备稳定性和延续性的同时拥有一定的适应性和灵活性。

♦开闭原则优点:

  • 减少软件测试的工作量:软件遵守开闭原则,软件测试时只需要对扩展的代码进行测试,因为原有的测试代码仍然能够正常运行
  • 提高代码的可复用性:粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性
  • 提高软件的可维护性,遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护

【参考:https://blog.csdn.net/LoveLion/article/details/7537584

原文地址:https://www.cnblogs.com/wangtao1211/p/12565611.html