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

面向对象设计原则之开闭原则开闭原则是面向对象的可复用设计的第一块基石 它是最重要的面向对象设计原则 开闭原则由 Bertrand nbsp Meyer 于 1988 年提出 其定义如下 开闭原则 Open ClosedPrinci OCP 一个软件实体应当对扩展开放 对修改关闭 即软件实体应尽量在不修改原有代码的情况下进行扩展 nbsp nbsp nbsp nbsp nbsp 在开闭原则的定义中 软件实体可以指一个软件模块

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

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

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

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

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

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

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

初始设计方案结构图

      在ChartDisplaydisplay()方法中存在如下代码片段:

...... 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类针对抽象图表类进行编程,由客户端来决定使用哪种具体图表。

      重构后结构如图2所示:

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

图2 重构后的结构图

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

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

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

 【作者:刘伟  http://blog.csdn.net/lovelion】
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222738.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:05
下一篇 2026年3月17日 下午3:06


相关推荐

  • vsftp怎么用_c++ ftp

    vsftp怎么用_c++ ftp一、vsftp以及安装服务端软件:vsftpd客户端软件:ftp端口号:20、21或指定范围内其他随机端口配置文件:vim/etc/vsftpd/vsftpd.conf#安装yuminstallvsftpdftp#开机自启systemctlenablevsftpd#启动systemctlstartvsftpd#查看端口开放情况netstat-antp二、工作模式,默认是主动port模式①主动模式(prot):FTP.

    2026年3月6日
    3
  • Grover算法思想

    Grover算法思想算法简介 Grover 算法是相较于经典数据库搜索算法 O n O n O n 复杂度实现二次加速的量子算法 即复杂度为 O N O sqrt N O N 算法本质 Grover 算法实质上是求解函数的逆问题的量子算法 即给定计算函数 y f1 x y f 1 x y f1 x 的黑盒 Orcale 算子 和已知 y0y 0y0 去求使函数满足 f1 x y0f 1 x y 0f1 x y0 的自变量 xxx 的值 算法步骤 该算法使用两个寄存器 第一个寄存器存储了 n 个量子比特 第二个寄存器是 Or

    2026年3月18日
    1
  • Pytest(11)allure报告「建议收藏」

    Pytest(11)allure报告「建议收藏」前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。mac环境:

    2022年7月31日
    9
  • Java中的快捷键大全「建议收藏」

    Java中的快捷键大全「建议收藏」1.常用快捷键(1)Ctrl+Space说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。注:避免输入法的切换设置与此设置冲突(2)Ctrl+Shift+Space说明:变量提示(3)Ctrl+/说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+\(4)Ctrl+Shift+/

    2022年7月8日
    21
  • DL入门(2):自编码器(AutoEncoder)

    DL入门(2):自编码器(AutoEncoder)简单叙述普通自编码器、堆叠自编码器、稀疏自编码器、降噪自编码器的原理及应用。

    2022年6月6日
    42
  • python中的eval函数的用法_isnan函数

    python中的eval函数的用法_isnan函数eval函数在Python中具有非常重要的地位,熟练的使用eval函数能够为我们的Python编程提供很多的便利之处。在本文中我将详细记录eval函数在Python中的使用方法及它带来便利时带来的一些其他危害,希望您阅读完本文后能够有所收获。欢迎在文章下方留言共同交流学习。

    2025年8月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号