面向对象设计原则之开闭原则

转载 2013年12月04日 20:29:54

文章转载:http://blog.csdn.net/lovelion/article/details/7537584


 开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand  Meyer1988年提出,其定义如下:

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

      在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类

      任何软件都需要面临一个很重要的问题,即它们的需求会随时间的推移而发生变化。当软件系统需要面对新的需求时,我们应该尽量保证系统的设计框架是稳定的。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。随着软件规模越来越大,软件寿命越来越长,软件维护成本越来越高,设计满足开闭原则的软件系统也变得越来越重要。

      为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在JavaC#等编程语言中,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。

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

初始设计方案结构图

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

[java] view plaincopy
  1. ......  
  2. if (type.equals("pie")) {  
  3.     PieChart chart = new PieChart();  
  4.     chart.display();  
  5. }  
  6. else if (type.equals("bar")) {  
  7.     BarChart chart = new BarChart();  
  8.     chart.display();  
  9. }  
  10. ......  

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

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

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

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

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

      重构后结构如图2所示:

图2 重构后的结构图

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

       注意:因为xmlproperties等格式的配置文件是纯文本文件,可以直接通过VI编辑器或记事本进行编辑,且无须编译,因此在软件开发中,一般不把对配置文件的修改认为是对系统源代码的修改。如果一个系统在扩展时只涉及到修改配置文件,而原有的Java代码或C#代码没有做任何修改,该系统即可认为是一个符合开闭原则的系统。

 【作者:刘伟  http://blog.csdn.net/lovelion

相关文章推荐

面向对象软件设计中的开闭原则

what: 软件设计过程中对扩展性开放,对修改关闭。即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标。 我们知道软件设计应当充分考虑软件的可维护性,即需求发生变化的时候软件结...

面向对象设计之开闭原则

开闭原则是面向对象的可复用设计的第一块基石,他是最重要的面向对象设计原则。开闭原则由Bertrand Meyer于1998年提出,其定义如下:开闭原则(Open-Closed Principle,OC...

面向对象设计原则--开闭原则(OCP)

OCP–Closed for Modification;Open for Extension. 开闭原则要求软件有一个良好的基本结构,确保面对变化的时候,仅仅扩展而不是修改现有对象的组织框架就可以随需...

面向对象设计的原则--开闭原则(OCP)

软件模块对扩展是开放的 当需求发生改变时,可以对模块进行扩展 软件模块对修改是封闭的 对模块进行扩展时, 无须改动模块的源代码。 似乎是矛盾的 ? ———————————————————————...

面向对象设计原则之开闭原则

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Princ...

面向对象设计原则---开闭原则

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand Meyer于1988年提出,其定义如下:开闭原则(Open-Closed Principle, ...
  • will130
  • will130
  • 2015年12月24日 15:19
  • 170

面向对象设计原则之开闭原则

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed P...
  • LoveLion
  • LoveLion
  • 2012年05月05日 15:05
  • 20799

Java面向对象之开闭原则

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed...
  • sdmjhca
  • sdmjhca
  • 2017年07月14日 15:22
  • 141

面向对象--单一职责原则和开闭原则学习(简易ImageLoader)

一、概述这篇是读《Android源码设计模式解析与实战》的第一篇记录,今天学习了面向对象六大原则中的其二:单一职责原则和开闭原则。单一职责原则简单来说一个类只实现一个功能;开闭原则则是对于扩展是开放的...

在Android如何在保证满足面向对象的单一原则(SRP)和开闭原则(OCP)的条件下,完成线程池的使用

下面先总结一下线程池相关的知识点: 关于线程池相关类的继承关系为: ThreadPoolExecutor—extends—》AbstractExecutorService—implements—》...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面向对象设计原则之开闭原则
举报原因:
原因补充:

(最多只允许输入30个字)