1. 对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码.
    1. 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为.
    2. Open:模块的行为是可以扩展的,即可以改变模块的功能.
    3. Close:对模块进行扩展时,不必改动DLL,Code,lib等.
    4. 封闭创建于抽象的基础之上.
  2. 关键是抽象.
    1. 抽象基类: 固定,能够描述一组任意个可能行为的抽象体.
    2. 派生类:    一组任意个可能的行为的表现.
    3. 模块操作抽象体.所以模块的依赖是一个固定(对修改封闭的)的抽象体.然后,通过从这个抽象体派生,可以扩展此模块的行为.
    1. 该结构的问题:
      1. 很可能会需要在switch中进行if/else判断.导致理解和发现所有需要增加对新增类型进行判断的难度.
      2. 同时,在给Type枚举添加成员时,由于所有的子类都依赖于该枚举,所以必须编译所有子类DLL.
    2. 再新增新类型时,只需要派生一个具有新功能的子类,并且实现相应的方法.同时更改main之类的new子类的地方.
    3. 而不再需要再改动系统既存的任何代码.
  3. 预测变化和"贴切的"结构.
    1. 如果预测到了某种变化,那么就可以设计一个抽象来隔离它.
    2. 无论模块多么的封闭,都存在以下无法对之封闭的变化.即没有对所有情况都贴切的模型.
    3. 所以,我们从经验中预测最有可能发生的变化的种类,然后构造抽象来隔离那些变化.
    4. 遵循OCP原则的代价很大,并且抽象本身也会增加设计的复杂性.开发人员也只能处理有限数量的抽象.
  4. 防止Hook.
    1. hook本身需要支持和维护,当不使用它们时就具有了不必要的复杂性的臭味.
    2. 只受一次愚弄.最初我们编写代码时,假设变化不会发生.当变化真的发生时,我们创建抽象来隔离以后发生的同类变化.
    3. 刺激变化,来尽早地查明可能发生的变化.

总结. 我们通过抽象来实现封闭,通过重载/hook来实现扩展.

只有当我们预测到了某种变化发生的可能性,或者某种变化已经发生时,才会创建抽象来应对以后同类的变化.

抽象会带来复杂性和成本.拒绝不成熟的抽象,和抽象本身一样重要.

[Agile Software Development(Principles,Patterns,and Pracitices)]

开放-封闭原则(OCP)的更多相关文章

  1. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

  2. 开放封闭原则(OCP)

    开放封闭原则 转:http://baike.baidu.com/view/2493421.htm转:http://dev.csdn.net/article/38/38826.shtm 开放封闭原则(O ...

  3. 1开放封闭原则OCP

    一.什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体 应当对扩展开放,则修改关闭. 在设计一个模块时,应当使得这个模块可以在不被修 改的前提下被扩展.也就是 ...

  4. 设计模式学习--面向对象的5条设计原则之开放封闭原则--OCP

    一.OCP简介(OCP--Open-Closed Principle):Software entities(classes,modules,functions,etc.) should be open ...

  5. C++ 设计模式 开放封闭原则 简单示例

    C++ 设计模式 开放封闭原则 简单示例 开放封闭原则(Open Closed Principle)描述 符合开放封闭原则的模块都有两个主要特性: 1. 它们 "面向扩展开放(Open Fo ...

  6. 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)

    开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...

  7. Observer观察者模式与OCP开放-封闭原则

    目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...

  8. (转) 面向对象设计原则(二):开放-封闭原则(OCP)

    原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...

  9. 开放-封闭原则(OCP)

    怎样的升级才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则(The Open-Closed Principle, OCP)为我们提供了指引.软件 ...

随机推荐

  1. MS WORD 表格自己主动调整列宽,自己主动变美丽,依据内容自己主动调整

    在MS WORD中,当有大量的表格出现时,调整每一个表格的的高和宽和大小将是一件很累的事情,拖来拖去,很耗时间,并且当WORD文档达到300页以上时,调整反应很的慢,每次拖拉线后,须要等待一段时间其才 ...

  2. android startActivityForResult的用法

    有时候我们需要把A activity提交数据给B  activity处理,然后把结果返回给A 这种方式在很多种情况需要用到,比如我应用的程序需要有拍照上传的功能. 一种解决方案是  我的应用程序 〉调 ...

  3. Flex+Struts2+JSON实现Flex和后台的HTTP Service请求

    http://www.fengfly.com/plus/view-191093-1.html Flex+Struts2+JSON的后台代码我在这就不多说了.不懂得请看我写的上一篇文章<Strut ...

  4. Dapper链接查询扩展

    一对多映射关系 /// <summary> /// 一对多连接查询 /// </summary> /// <typeparam name="FirstT&quo ...

  5. Disable right click on the website

    Many developers/website owners like to keep their website images personal and don't want anyone to c ...

  6. Graylog2+mongdb+rsyslog中央日志服务器对syslog的web管理--转载

    原文地址:http://blog.sina.com.cn/s/blog_49be4d570100yvv1.html 1.下载mongodb,可以通过下面2中方法安装. (1)官网下载yum源后直接安装 ...

  7. android图片特效处理之模糊效果

    这篇将讲到图片特效处理的模糊效果.跟前面一样是对像素点进行处理,算法是通用的,但耗时会更长,至于为什么,看了下面的代码你就会明白. 算法: 一.简单算法:将像素点周围八个点包括自身一共九个点的RGB值 ...

  8. LeetCode22 Generate Parentheses

    题意: iven n pairs of parentheses, write a function to generate all combinations of well-formed parent ...

  9. AsyncTask的介绍

    android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接 ...

  10. Android学习笔记⑧——UI组件的学习AdapterView相关2

    前面都是用ListView控件来配合Adapter做的一些实例,这次我们来见识一下GridView与Adapter之间的爱恨情仇.... GridView是用于在界面上按行.列分布的方式来显示多个的组 ...