开放-封闭原则(OCP)
- 对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码.
- 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为.
- Open:模块的行为是可以扩展的,即可以改变模块的功能.
- Close:对模块进行扩展时,不必改动DLL,Code,lib等.
- 封闭创建于抽象的基础之上.
- 关键是抽象.
- 抽象基类: 固定,能够描述一组任意个可能行为的抽象体.
- 派生类: 一组任意个可能的行为的表现.
- 模块操作抽象体.所以模块的依赖是一个固定(对修改封闭的)的抽象体.然后,通过从这个抽象体派生,可以扩展此模块的行为.


- 该结构的问题:
- 很可能会需要在switch中进行if/else判断.导致理解和发现所有需要增加对新增类型进行判断的难度.
- 同时,在给Type枚举添加成员时,由于所有的子类都依赖于该枚举,所以必须编译所有子类DLL.

- 再新增新类型时,只需要派生一个具有新功能的子类,并且实现相应的方法.同时更改main之类的new子类的地方.
- 而不再需要再改动系统既存的任何代码.
- 该结构的问题:
- 预测变化和"贴切的"结构.
- 如果预测到了某种变化,那么就可以设计一个抽象来隔离它.
- 无论模块多么的封闭,都存在以下无法对之封闭的变化.即没有对所有情况都贴切的模型.
- 所以,我们从经验中预测最有可能发生的变化的种类,然后构造抽象来隔离那些变化.
- 遵循OCP原则的代价很大,并且抽象本身也会增加设计的复杂性.开发人员也只能处理有限数量的抽象.
- 防止Hook.
- hook本身需要支持和维护,当不使用它们时就具有了不必要的复杂性的臭味.
- 只受一次愚弄.最初我们编写代码时,假设变化不会发生.当变化真的发生时,我们创建抽象来隔离以后发生的同类变化.
- 刺激变化,来尽早地查明可能发生的变化.
总结. 我们通过抽象来实现封闭,通过重载/hook来实现扩展.
只有当我们预测到了某种变化发生的可能性,或者某种变化已经发生时,才会创建抽象来应对以后同类的变化.
抽象会带来复杂性和成本.拒绝不成熟的抽象,和抽象本身一样重要.
[Agile Software Development(Principles,Patterns,and Pracitices)]
开放-封闭原则(OCP)的更多相关文章
- 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则
单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...
- 开放封闭原则(OCP)
开放封闭原则 转:http://baike.baidu.com/view/2493421.htm转:http://dev.csdn.net/article/38/38826.shtm 开放封闭原则(O ...
- 1开放封闭原则OCP
一.什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体 应当对扩展开放,则修改关闭. 在设计一个模块时,应当使得这个模块可以在不被修 改的前提下被扩展.也就是 ...
- 设计模式学习--面向对象的5条设计原则之开放封闭原则--OCP
一.OCP简介(OCP--Open-Closed Principle):Software entities(classes,modules,functions,etc.) should be open ...
- C++ 设计模式 开放封闭原则 简单示例
C++ 设计模式 开放封闭原则 简单示例 开放封闭原则(Open Closed Principle)描述 符合开放封闭原则的模块都有两个主要特性: 1. 它们 "面向扩展开放(Open Fo ...
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...
- Observer观察者模式与OCP开放-封闭原则
目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...
- (转) 面向对象设计原则(二):开放-封闭原则(OCP)
原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...
- 开放-封闭原则(OCP)
怎样的升级才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则(The Open-Closed Principle, OCP)为我们提供了指引.软件 ...
随机推荐
- 导入word数据
public static List<FL> ImportDOC(object fileName,out StringBuilder meg) { List<FL> ...
- 【JavaScript】n++ VS ++n
var n = 1; console.log(n++);--------------->表达式的值为 1; n的值为2 console.log(++n);--------------->表 ...
- JAVA学习第五十七课 — IO流(十一)
一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该 ...
- MySQL · 引擎特性 · InnoDB 事务锁简介
https://yq.aliyun.com/articles/4270# zhaiwx_yinfeng 2016-02-02 19:00:43 浏览2194 评论0 mysql innodb lock ...
- IT思想类智力题
1. 台阶问题 题目:一个人上台阶可以一次上一个或两个,问这个人上n层的台阶,一共有多少种走法. 本题可以采用递归的方法来设计模型,先从数字的规律入手:假设共有i阶台阶,走完所有的台阶有n种走法,则存 ...
- Web前段优化,提高加载速度 css
前言: 在同样的网络环境下,两个同样能满足你的需求的网站,一个"Duang"的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒, ...
- linux shell “(())” 双括号运算符使用
导读 在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算.估计很多朋友都感觉比较难以接受.特变逻辑运算符"[]"使用时候,必须保证运算符与算数 之间有空格 ...
- 乐观锁(optimistic locking)与悲观锁(pessimistic locking)
首先,乐观锁(optimistic locking)与悲观锁(pessimistic locking)基本是针对数据处理来说,也就是跟数据库有关的术语,目的是为了解决并发处理时所遇到的相关性能问题,以 ...
- 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF
存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...
- Amazon Launches FBA Export to Expand Beyond Media Categories
Amazon launched a new program called FBA Export for third-party sellers to help them export products ...