经典力学的基石是牛顿三大定律。而面向对象的可复用设计(OOD)的第一块基石,便是“开--闭”原则(Open-Closed principle,缩写为OCP)。
一、什么是“开闭”原则?
“开--闭”原则讲的是:一个软件实体应当对扩展开放,对修改关闭。英文的原文是:Software entities should be open for extension,but closed for modification。
这个原则说的是,在设计一个模块的时候,应当使这个模块可以在不修改的前提下被扩展。换言之,应当可以在不必修改源代码的情况下修改这个模块的行为。这句话听上去好像是矛盾的,但是实际上通过面向对象的设计原则和设计模式就能实现这一点。
所有的软件系统都有一个共同的性质,即对他们的需求都会随时间的推移而发生变化。在软件系统面临新的需求时,系统的设计必须是稳定的。满足“开--闭”原则的设计可以给一个软件系统两个无可比拟的优越性:
①通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。②已有的软件模块,特别是最重要的抽象层模块不能在修改,这就使变化中的软件系统有一定的稳定性和延续性。
具有这两个优点的软件系统是一个在高层次上实现了复用的系统,也是一个易于维护的系统。
二、怎样做到“开--闭”原则?
“知固而不知革,物失其则;知革而不知固,物失其均。”如果一个系统不可扩展,则系统失去其价值;而一个系统动辄需要修改,便会失去重心。
解决“开闭”原则的关键在于抽象化。在像java语言这样的面向对象的编程语言里面,可以给系统定义出一个一劳永逸、不在更改的抽象设计,此设计允许有无穷无尽的行为在实现层被实现。在java语言里,可以给出一个或多个抽象java类或java接口,规定出所有的具体类必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有可能扩展,因此,在任何情况下都不会改变。这就使的系统的抽象层不需要修改,从而满足了“开闭”原则的第二条:对修改关闭。
同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开发的,,这就满足了“开闭”原则的第一条:对扩展开放。
三、对可变性的封装原则
“开闭”原则如果从工程的角度来讲,就是所谓的“对可变性的封装原则”。“对可变性的封装原则”讲的是找到一个系统的可变因素,将之封装起来。在这里意味着两点:
①一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类,因此,可以在设计模式中看到继承关系。继承应该被当做是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象的方法。
②一种可变性不应当与另一种可变性混合在一起。如果深入研究设计模式的类图的话,会发现所有的类图的继承结构一般都不会超过两层,不然意味着将两种不同的可变性混合在一起了。
如果将“可变性的封装原则”作为总的设计原则的话,按照这个原则进行的系统设计就应当遵守“开闭”原则。尽管在很多情况下,无法百分之百的做到,但是如果向这个方向上努力就能够得到部分的成功,就可以显著改善一个系统的结构。
四、开闭原则与其他设计原则的关系
做到开闭原则不是一件容易的事情,但是她也是有很多规律可循的。这些规律也同样以设计原则的身份出现,但是他们都是“开闭”原则的手段和工具,是附属于“开闭”原则的。这些设计模式包括:里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则。
本文通过总结《java与模式》而来。
相关推荐
。。。
。。。
主要介绍了Java设计模式编程中的开闭原则,开闭原则的大意被作者总结为用抽象构建框架,用实现扩展细节,需要的朋友可以参考下
程序员考试刷题java8-ocp-study-notes 跟踪 OCP Java 8 书籍学习指南的存储库 我将在这里介绍的这本书是 Java 8 认证指南的第二部分。 第一个指南涵盖 OCA 考试(我已经通过了),本指南涵盖了 OCP 考试(1Z0-809 ...
第九章 开放—封闭原则(OCP) 9.1 开放—封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.4 结论 参考文献 第十章 Liskov替换原则(LSP) 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.3 正方形和矩形,...
第九章 开放—封闭原则(OCP) 9.1 开放—封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.4 结论 参考文献 第十章 Liskov替换原则(LSP) 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.3 正方形和矩形,...
本书中,享誉全球的软件开发专家和软件工程大师RobertC.Martin深入而生动地使用真实案例讲解了面向对象基本原则、重要的设计模式、UML和敏捷实践等程序员必备的知识。 本书于2003年荣获第13届Jolt大奖,是C++和Java...
1.5.1 开-闭原则(OPEN-CLOSED PRINCIPLE, OCP): 7 1.5.2 里氏代换原则(LISKOV SUBSTITUTION PRINCIPLE,常缩写为.LSP) 8 1.5.3 依赖倒置原则(DEPENDENCE INVERSION PRINCIPLE) 8 1.5.4 接口隔离原则(INTERFACE ...
第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP:单一职责原则 第9章 OCP:开放-封闭原则 第10章 ...
中文名: 敏捷软件开发:原则、模式与实践 原名: Agile Software Development:Principles,Patterns and Practices 别名: 软件工程实践丛书 作者: (美)Robert C.Martin译者: 邓辉 孟岩图书分类: 软件 资源格式: PDF ...
7.S.O.L.I.D五大原则之开闭原则OCP 8.S.O.L.I.D五大原则之里氏替换原则LSP 9.根本没有“JSON对象”这回事! 10.JavaScript核心(晋级高手必读篇) 11.执行上下文(Execution Contexts) 12.变量对象(Variable ...
OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。 DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程。 LoD(迪米特法则,Law of ...
分析各种设计决策及其得失,以清晰、易于理解的方式讲述了真实程序设计中最基本然而也是最难做到正确应用的原则(包括srp、lsp、ocp、dip、isp等类设计原则,以及多个包设计原则)与设计模式(不限于gof经典模式,...
OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。 DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口编程,不要针对实现编程(不要让类继承具体类,而是继承...
深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP 深入理解JavaScript系列(9):根本没有“JSON对象”这回事! 深入理解...
第9章 开放—封闭原则(OCP) 9.1 开发—封闭原则(OCP) 9.2 描述 9.3 关键是抽象 9.4 结论 参考文献 第10章 Liskov替换原则(LSP) 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.3 正方形...
深入理解JavaScript系列(7):S O L I D五大原则之开闭原则OCP 深入理解JavaScript系列(8):S O L I D五大原则之里氏替换原则LSP 深入理解JavaScript系列(9):根本没有“JSON对象”这回事 深入理解...