`
Michael.Jackson
  • 浏览: 14178 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

The Open-Closed Principle (OCP) - OO设计的开闭原则  <br>本文来自德仔网 http://www.dezai.cn/Cha

阅读更多

开闭原则(OCP:Open-Closed Principle)是指在进行面向对象设计(OOD:Object Oriented Design)中,设计类或其他程序单位时,应该遵循:
- 对扩展开放(open)
- 对修改关闭(closed)
的设计原则。

开闭原则是判断面向对象设计是否正确的最基本的原理之一。

根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。
- 扩展开放:某模块的功能是可扩展的,则该模块是扩展开放的。软件系统的功能上的可扩展性要求模块是扩展开放的。
- 修改关闭:某模块被其他模块调用,如果该模块的源代码不允许修改,则该模块修改关闭的。软件系统的功能上的稳定性,持续性要求是修改关闭的。

这也是系统设计需要遵循开闭原则的原因:

1)稳定性。开闭原则要求扩展功能不修改原来的代码,这可以让软件系统在变化中保持稳定。
2)扩展性。开闭原则要求对扩展开放,通过扩展提供新的或改变原有的功能,让软件系统具有灵活的可扩展性。
遵循开闭原则的系统设计,可以让软件系统可复用,并且易于维护。


 
开闭原则的实现方法
 
为了满足开闭原则的 对修改关闭(closed for modification) 原则以及扩展开放(open for extension) 原则,应该对软件系统中的不变的部分加以抽象,在面向对象的设计中,
- 可以把这些不变的部分加以抽象成不变的接口,这些不变的接口可以应对未来的扩展;
- 接口的最小功能设计原则。根据这个原则,原有的接口要么可以应对未来的扩展;不足的部分可以通过定义新的接口来实现;
- 模块之间的调用通过抽象接口进行,这样即使实现层发生变化,也无需修改调用方的代码。

接口可以被复用,但接口的实现却不一定能被复用。接口是稳定的,关闭的,但接口的实现是可变的,开放的。可以通过对接口的不同实现以及类的继承行为等为系统增加新的或改变系统原来的功能,实现软件系统的柔软扩展。

简单地说,软件系统是否有良好的接口(抽象)设计是判断软件系统是否满足开闭原则的一种重要的判断基准。现在多把开闭原则等同于面向接口的软件设计。

 

三、OCP优点:
1、降低程序各部分之间的耦合性,使程序模块互换成为可能;
2、使软件各部分便于单元测试,通过编制与接口一致的模拟类(Mock),可以很容易地实现软件各部分的单元测试;
3、利于实现软件的模块的呼唤,软件升级时可以只部署发生变化的部分,而不会影响其它部分;
 
四、使用OCP注意点:
1、实现OCP原则的关键是抽象;
2、两种安全的实现开闭原则的设计模式是:Strategy pattern(策略模式),Template Methord(模版方法模式);
3、依据开闭原则,我们尽量不要修改类,只扩展类,但在有些情况下会出现一些比较怪异的状况,这时可以采用几个类进行组合来完成;
4、将可能发生变化的部分封装成一个对象,如: 状态, 消息,,算法,数据结构等等 , 封装变化是实现"开闭原则"的一个重要手段,如经常发生变化的状态值,如温度,气压,颜色,积分,排名等等,可以将这些作为独立的属性,如果参数之间有关系,有必要进行抽象。对于行为,如果是基本不变的,则可以直接作为对象的方法,否则考虑抽象或者封装这些行为;
5、在许多方面,OCP是面向对象设计的核心所在。遵循这个原则可带来面向对象技术所声称的巨大好处(灵活性、可重用性以及可维护性)。然而,对于应用程序的每个部分都肆意地进行抽象并不是一个好主意。应该仅仅对程序中呈现出频繁变化的那部分作出抽象。拒绝不成熟的抽象和抽象本身一样重要;


开闭原则的相对性
软件系统的构建是一个需要不断重构的过程,在这个过程中,模块的功能抽象,模块与模块间的关系,都不会从一开始就非常清晰明了,所以构建100%满足开闭原则的软件系统是相当困难的,这就是开闭原则的相对性。但在设计过程中,通过对模块功能的抽象(接口定义),模块之间的关系的抽象(通过接口调用),抽象与实现的分离(面向接口的程序设计)等,可以尽量接近满足开闭原则。

分享到:
评论

相关推荐

    解决fatal:remote error:You can’t push to git://github.com/username/*.git问题的办法

    解决fatal:remote error:You can’t push to git://github.com/username/*.git问题的办法 今天Git push的时候 fatal:remote error: You can't push to git://github....看来我是没有权限push啊。 解决方法: ...接

    The Open-Closed Principle

    开放封闭原则(Open-Closed Principle, OCP)作为面向对象设计的重要原则之一,旨在解决软件系统在生命周期内面对变化时的稳定性问题。本文将深入探讨开放封闭原则的概念、意义及其应用实践。 #### 开放封闭原则...

    spring boot整合CAS Client实现单点登陆验证的示例

    &lt;artifactId&gt;cas-client-autoconfig-support&lt;/artifactId&gt; &lt;version&gt;1.4.0-GA&lt;/version&gt; &lt;/dependency&gt; ``` 然后,我们需要在 application.properties 文件中添加 CAS 服务器的 URL: ```properties cas.server-...

    Java_面向对象设计原则总结

    5 开闭原则-The Open-Closed Principle (OCP)   二 包的设计原则 6 重用发布等价原则-Release Reuse Equivalency Principle (REP) 7 无环依赖原则-The Acyclic Dependencies Principle (ADP) 8 稳定依赖...

    uml与设计模式

    《UML与设计模式》 在软件开发领域,UML(Unified Modeling Language,统一建模语言)和设计模式是两个至关重要的概念。UML是一种通用的、可视化的建模工具,用于描述、可视化、构建和文档化软件系统。而设计模式则...

    动力节点老杜Spring6,配套笔记PDF文件

    动力节点老杜Spring6配套笔记主要讲解了Spring框架的一些核心概念和最佳实践,特别是针对代码设计中的开闭原则(Open-Closed Principle, OCP)进行了深入探讨。在给出的代码示例中,我们可以看到一个简单的用户登录...

    开闭原则OCP.zip

    开闭原则(Open-Closed Principle,简称OCP)是软件设计模式中的一个基本原则,由艾兹格·迪米特里斯·伯纳斯-李提出。这个原则指出,软件实体(类、模块、函数等)应当对扩展开放,对修改关闭。换句话说,当软件...

    Oracle网址大全

    - **Oracle粉丝网**: 一个由爱好者创建的非官方网站。 - **网址**: [http://www.oraclefan.net/JonsonHuo](http://www.oraclefan.net/JonsonHuo) - **功能**: 提供了一些关于Oracle的技术文章和个人经验分享。 - ...

    面型对象设计原则——开闭原则(OCP)的Demo+静态结构图

    开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在软件工程领域具有举足轻重的地位。该原则由 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出,旨在提高...

    Java Web设计模式之OCP(开闭原则)

    开闭原则(Open-Closed Principle,OCP)是软件工程中的一个基本原则,由Bertrand Meyer在1988年提出,它是面向对象设计的核心之一。这个原则规定了软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这...

    JAVA设计模式之设计原则 ---开闭原则源码

    开闭原则(Open-Closed Principle,OCP)的核心思想是:“软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭”。这意味着,当需求改变时,我们应尽量通过扩展已有代码,而不是修改已有的代码来实现新功能。...

    OO设计五个原则.pdf

    本文将详细解析这五大原则之一——开闭原则(Open-Closed Principle,简称OCP),并探讨其在软件开发过程中的应用与实践。 ### 开闭原则:面向对象设计的核心 开闭原则是由Bertrand Meyer于1988年提出的,它强调...

    微软翻译Api的使用

    'Ocp-Apim-Subscription-Key' =&gt; $subscriptionKey, 'Content-Type' =&gt; 'application/json', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); ...

    OCP考试资料-OCP-19c-082.docx

    ROLLBACK语句后,再执行DML语句。(提交或回滚结束事务,接着的DML开启新事务)答案:A、B **知识点详解** 1. **Oracle数据库中的节省...理解这些知识点对于准备OCP(Oracle Certified Professional)考试至关重要。

    Python库 | ocp_windows_386-0.1.3-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:ocp_windows_386-0.1.3-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    OO设计原则总结.doc

    #### 开闭原则:Open-Closed Principle (OCP) 开闭原则主张“对扩展开放,对修改关闭”。具体来说,就是: - **增强灵活性**:允许在不修改现有代码的情况下,通过新增代码的方式对系统进行扩展。 - **提高稳定性*...

    ocp原则

    开放-封闭原则(Open-Closed Principle, OCP)是软件工程中一个至关重要的设计原则,它由Bertrand Meyer于1988年提出,并由Robert C. Martin进一步阐述和发展。OCP的核心理念在于确保软件实体(如类、模块、函数等)对...

    安捷伦_Agilent电源使用手册.pdf

    * SN:&lt;char&gt;: 电源序列号码 三、电源的操作模式 * lokal: 使电源从程序控制状态转换到手动控制状态 * Remote: 程序控制接口 HP-IB,RS232 处于工作状态 * Output On/Off: 使输出打开或关闭 四、测量功能 * ...

    该怎么使用Java设计模式编程中的OCP开闭原则?.pdf

    该怎么使用 Java 设计模式编程中的 OCP 开闭原则? 在软件开发中,开闭原则是面向对象设计中最基础的设计原则之一,它指导我们如何建立稳定灵活的系统。开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放...

Global site tag (gtag.js) - Google Analytics