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. SQL Server DATEDIFF() 函数

    Server Date 函数 定义和用法 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 e ...

  2. 使用cwRsync实现windows下文件定时同步【转】

    1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1 ...

  3. oc-15-枚举结构体

    Cat.h #import <Foundation/Foundation.h> // 颜色的枚举 typedef enum{ ColorBlack, ColorYeallow } Colo ...

  4. HTML目录

    1. 表格标记 2. HTML常用标记 3. 博客园添加访问人数统计 4. 如何快速掌握CSS(各种CSS工具) 5. HTTP协议状态码详解(HTTP Status Code)(转)

  5. Linux编程之《看门狗进程》

    Intro 当我们编写服务器代码时,为了让自己的服务器在意外崩溃时能够及时的重启,软件看门狗就显示出它的作用了,该看门狗进程是通过fork一个子进程(业务进程),父进程一旦捕获到了子进程的结束信号就重 ...

  6. hadoop2 作业执行过程之作业提交

    hadoop2.2.0.centos6.5 hadoop任务的提交常用的两种,一种是测试常用的IDE远程提交,另一种就是生产上用的客户端命令行提交 通用的任务程序提交步骤为: 1.将程序打成jar包: ...

  7. solr查询在solrconfig.xml中的配置

    <requestHandler name="/select" class="solr.SearchHandler"> <lst name=&q ...

  8. java 输入输出 io

    学习JAVA  输入输出篇 java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner.实例程序:一,利用 Scanner ...

  9. ReentrantLock类的基本结构

    ReentrantLock类是一个可重入互斥锁,它具有与使用synchronized()方法和语句访问隐式监视器锁相同的基本行为和语义,但是它的功能更强大.ReentrantLock由最近成功获得锁但 ...

  10. LRU算法实现

    JDK中的实现 在JDK中LinkedHashMap可以作为LRU算法以及插入顺序的实现,LinkedHashMap继承自HashMap,底层结合hash表和双向链表,元素的插入和查询等操作通过计算h ...