设为首页 收藏本站
查看: 1538|回复: 0

[经验分享] 二 :OCP(开闭原则)

[复制链接]

尚未签到

发表于 2016-9-4 10:00:17 | 显示全部楼层 |阅读模式
  Open-Close Principle
  **********************************************************************************
  表述:
  1. 一个软件实体应当对扩展开放 , 对修改封闭;
  
  2. 对可变性的封闭原则;
  
  3. 找到一个系统的可变因素,将它封闭起来;
  
  
  
  也就是说在设计一个模块的时候,应当可以在不被修改的前提下被扩展。解决问题的关键就在于:抽象化!
  
  那就是不允许更改系统的抽象层,而允许扩展系统的实现层。
  
  
  我们让模块依赖于一个固定的抽象体,这样它就是不可以修改的;同时,通过这个抽象体派生,我们就可以扩展此模块的具体功能。这样设计的程序只通过增加代码来变化而不是通过更改现有代码来变化,前面提到的修改的副作用就没有了。

   “-原则如果从另外一个角度讲述,就是找到一个系统的可变因素,将它封装起来,也即所谓的对可变性的封装原则”(Principle of Encapsulation of Variation, EVP)

   在我们考虑一个系统的时候,我们不要把关注的焦点放在什么会导致设计发生变化上(具体),而是考虑允许什么发生变化而不让这一变化导致重新设计(抽象)。也就是说,我们的设计应支持变化。   
  
  

总结:
1.         一个软件系统的所有模块不可能都满足OCP,但是我们应该努力最小化这些不满足OCP的模块数量。
2.         开放-封闭法则是OO设计的真正核心。
3.         符合该法则便意味着最高等级的复用性(reusability)和可维护性(maintainability)。
  
  
  
  策略模式举例:商场打折,不同物品不同折扣,不同季节不同折扣
     
   
“对可变性的封装原则”意味着两点:
1.         一种可变性应当被封装到一个对象里面,而不应当散落到代码的很多角落里。
同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。
继承应当被看作是封装变化的方法,而不应当是被认为从一般的对象生成特殊的对象的方法(继承经常被滥用)
   
2.         一种可变性不应当与另外一种可变性混合在一起。从具体的类图来看,如果继承结构超过了两层,那么就意味着将两种不同的可变性混合在了一起。

   “对可变性的封装原则”从工程的角度说明了如何实现OCP。如果按照这个原则来设计,那么系统就应当是遵守OCP的。但是现实的情况往往是纷繁复杂的,我们不可能100%的遵守OCP,但是我们要向这个目标来靠近。设计者要对设计的模块对何种变化进行封装做出选择。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-267395-1-1.html 上篇帖子: 开放---封闭原则(OCP) 下篇帖子: We Should Care About OCP…
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表