软件设计原则(一)开闭原则(Open-Closed Principle, OCP)
来源:互联网 发布:卡梅隆安东尼 知乎 编辑:程序博客网 时间:2024/05/21 22:21
狭义理解:对扩展开发,对修改封闭
在学习设计模式之前,应该先对软件设计原则有一定的了解,设计模式在一定程度上是迎合软件设计原则而产生的,脱离了软件设计原则,设计模式是没有意义的。
开-闭原则(Open-Closed Principle, OCP)
1.什么是开闭原则
1988年,Bertrand Meyer在他的著作《Object Oriented Software Construction》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,我们把它讲得更通俗一点,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
2.如何实现开闭原则
实现开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。
我们在软件开发的过程中,一直都是提倡需求导向的。这就要求我们在设计的时候,要非常清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么情况下使用开闭原则。
关于系统可变的部分,还有一个更具体的原则是对可变性的封装原则(Principle of Encapsulation of Variation, EVP),它从软件工程实现的角度对开闭原则进行了进一步的解释。EVP要求在做系统设计的时候,对系统所有可能发生变化的部分进行评估和分类,每一个可变的因素都单独进行封装。“对可变性的封装原则”意味着两点:
(1)一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类,因此,我们可以期待在设计模式中看到继承关系。继承应当被看做是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象的方法。
(2)一种可变性不应当与另一种可变性混合在一起。
我们在实际开发过程的设计开始阶段,就要罗列出来系统所有可能的行为,并把这些行为加入到抽象底层,根本就是不可能的,这么去做也是不经济的,费时费力。另外,在设计开始阶段,对所有的可变因素进行预计和封装也不太现实,也是很难做得到。所以,开闭原则描绘的愿景只是一种理想情况或是极端状态,现实世界中是很难被完全实现的。我们只能在某些组件,在某种程度上符合开闭原则的要求。
通过以上的分析,对于开闭原则,我们可以得出这样的结论:虽然我们不可能做到百分之百的封闭,但是在系统设计的时候,我们还是要尽量做到这一点。
对于软件系统的功能扩展,我们可以通过继承、重载或者委托等手段实现。以接口为例,它对修改就是是封闭的,而对具体的实现是开放的,我们可以根据实际的需要提供不同的实现,所以接口是符合开闭原则的。
3.开闭原则能够带来什么好处
如果一个软件系统符合开闭原则的,那么从软件工程的角度来看,它至少具有这样的好处:
(1)可复用性好
我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的功能,非常灵活。因此,这个软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。
(2)可维护性好
由于对于已有的软件系统的组件,特别是它的抽象底层不去修改,因此,我们不用担心软件系统中原有组件的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。
4.闭原则与其它原则的关系
开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。因此,针对开闭原则的实现方法,一直都有面向对象设计的大师费尽心机,研究开闭原则的实现方式。其它原则和方法如:里氏代换原则(LSP)、依赖倒转原则(DIP)、接口隔离原则(ISP)以及抽象类(Abstract Class)、接口(Interace)等等,都可以看作是开闭原则的实现方法。
此部分参考:http://www.cnblogs.com/wanghao72214/archive/2009/03/13/1410610.html
- 软件设计原则(一)开闭原则(Open-Closed Principle, OCP)
- “开闭原则”(Open-Closed Principle,OCP
- 开闭原则(Open-Closed Principle,或者OCP)
- The Open-Closed Principle (OCP) - 面向对象软件设计的开闭原则
- 开闭原则(open-closed principle)
- 开闭原则(Open-Closed Principle)
- 第九章 OCP:The Open-Closed Principle(开闭原则)
- The Open-Closed Principle (OCP) - OO设计的开闭原则
- 类之OCP(Open Closed Principle):开闭原则
- 开闭原则——open-closed principle, ocp
- 设计模式六大原则(6):开闭原则OCP(The Open/Closed Principle )
- OCP(Open-Closed Principle)开放封闭原则
- 开-闭原则(OCP - Open-Closed Principle )
- 【六大设计原则】6. 开闭原则 -Open Closed Principle
- “开-闭”原则 (Open-Closed principle, OCP)
- 开放-封闭原则(OCP:The Open-Closed Principle)
- 开放封闭原则(OCP,Open Closed Principle)
- “开-闭”原则 (Open-Closed principle, OCP)
- Hbase的phonenix安装
- 如何分析应用的焦点被抢了
- php7空合并运算符
- 【源码分析】分布式锁-RedisLockRegistry源码分析[转]
- CTF编码和加密总结
- 软件设计原则(一)开闭原则(Open-Closed Principle, OCP)
- Hibernate的乐观锁与悲观锁
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java源码下载地址
- [组合数]求组合数的几种方法总结
- 基础Android之百度定位
- 深度增强学习David Silver(三)——动态规划的planning
- java 中的内存泄露
- Linux下weblogic文件启动上锁