6. 开闭原则(Open Closed Principle,OCP)
6.1 定义
(1)一个类应该对扩展开放,对修改关闭。要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己有的源代码或二进制代码。
(2)在软件生命周期内,变化是一个既定的事实,在设计时尽量适应这些变化,以提高项止的稳定性和灵活性,真正实现“拥抱变化”。而开闭原则告诉我们要通过扩展来实现这些变化而不是修改原来代码。
(3)修改关闭,并不意味着软件不做任何的改动,低层模块的变更,必然要高层模块进行耦合,否则就是一个弧立无意义的代码片段。
6.2 开闭原则优点
(1)通过扩展己有的功能,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性
(2)己有的软件模块,特别是最重要的抽象层模块不能再修改,这就使得变化中的软件有一定的稳定性和延续性
(3)同时满足了可复用性与可维护性
6.3 如何使用开闭原则
(1)抽象约束
①通过接口或抽象类约束扩展,对扩展进行边界限定。通过接口,只能使用由接口提供的方法。
②参数类型、引用对象尽量使用接口或抽象类,而不是具体的实现类
③抽象层尽量保持稳定,一旦确定就不要修改。
(2)元数据(metadata)控制模块行为
元数据就是用来描述环境和数据的数据。尽量使用元数据来控制程序的行为,减少重复开发。
(3)制定项目章程
(4)封装变化
①将相同的变化封装到一个接口或抽象类中;变化不应当散落在代码的许多角落,而应当被封装到一个对象里。同一种变化的不同表象意味着是同一个继承等级结构中的具体子类。
②将不同的变化封装到不同的接口或抽象类中,不应该有两个不同变化出现在同一个接口或抽象类。一种变化与另一种变化混合在一起,会违反单一性原则,所以应被分开。
6.4 最佳实践
(1)几种设计原则的小结(6个原则的首字母组合单词(S.O.L.I.D,表示稳定)
①单一职责原则告诉我们实现类要职责单一;
②里氏替换原则告诉我们不要破坏继承体系;
③依赖倒置原则告诉我们要面向接口编程;
④接口隔离原则告诉我们在设计接口的时候要精简单一;
⑤迪米特法则告诉我们要降低耦合。
⑥开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
(2)建立稳定、灵活、健壮的设计,开闭原则是最基础的原则,也是精神领袖
(3)开闭原则是最基础的一个原则,前五个原则都是开闭原则的具体形态,而开闭原则才是灵魂。换一个角度,借用OOP的说法,开闭原则是抽象类,其他五大原则是具体的实现类。
第2章 面向对象的设计原则(SOLID):6_开闭原则的更多相关文章
-
C#软件设计——小话设计模式原则之:开闭原则OCP
前言:这篇继续来看看开闭原则.废话少说,直接入正题. 软件设计原则系列文章索引 C#软件设计——小话设计模式原则之:依赖倒置原则DIP C#软件设计——小话设计模式原则之:单一职责原则SRP C#软件 ...
-
【面向对象设计原则】之开闭原则(OCP)
开闭原则是面向对象设计的一个重要原则,其定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进 ...
-
面向对象设计原则二:开闭原则(OCP)
开闭原则(OCP)定义:对扩展开发,对修改关闭.好处: 适应性和灵活性. 稳定性和延续性. 可复用性与可维护性. 解释说明:开闭原则指的是两方面:对功能扩展开发,对修改进 ...
-
【设计模式六大原则6】开闭原则(Open Close Principle)
定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...
-
第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)
2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...
-
设计原则:开-闭原则(Open-Closed Principle, OCP)
开-闭原则就是软件实体应当对扩展开放,对修改关闭.(Software entities should be open for extension,but closed for modification ...
-
Java设计原则—开闭原则(转)
原文出自:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Ja ...
-
Java设计模式(1:软件架构设计七大原则及开闭原则详解)
前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,笔主特别开了这个博客来记录自己学习的 ...
-
[设计模式]<;<;设计模式之禅>;>;关于开闭原则
开闭原则是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统,先来看开闭原则的定义: Software entities like classes,modules and fun ...
随机推荐
-
hdu2196
基本的树形dp,需要dfs三次,第一次求每个点最远的后代,第二次和第三次每个点的孩子分别从左到右和从右到左遍历. #include <cstdio> #include <vector ...
-
wget 下载整个网站,或者特定目录
需要下载某个目录下面的所有文件.命令如下 wget -c -r -np -k -L -p www.xxx.org/pub/path/ 在下载时.有用到外部域名的图片或连接.如果需要同时下载就要用-H参 ...
-
[HRBUSTOJ1476]Pairs(FFT)
题目链接:http://acm-software.hrbust.edu.cn/problem.php?id=1476 题意:给n个数,m次询问,每次询问一个k.问n个数里两数之和严格小于k的数对. 根 ...
-
MinGW 编译libwebsockets
libwebsockets是一个轻量的纯C库,在这里尝试使用MinGW进行构建. 官网地址:http://libwebsockets.org/trac/libwebsockets下载地址:http:/ ...
-
find——文件查找命令 linux一些常用命令
find 命令eg: 一般文件查找方法: 1. find /home -name file , 在/home目录下查找文件名为file的文件2. find /home -name '*file ...
-
Hessian源码分析--HessianProxy
在上一篇博客 Hessian源码分析--HessianProxyFactory 中我们了解到,客户端获得的对象其实是HessianProxy生成的目标对象,当调用目标对象的方法时,会调用Hessian ...
-
信号为E时,如何让语音识别脱“网”而出?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯教育云发表于云+社区专栏 一般没有网络时,语音识别是这样的 ▽ 而同等环境下,嵌入式语音识别,是这样的 ▽ 不仅可以帮您边说边识. ...
-
(转)从程序员到CTO
好好努力吧,向优秀的人看齐.文章来自http://blog.csdn.net/smarttony/article/details/6697617
-
Python 爬虫 ajax爬取马云爸爸微博内容
ajax爬取情况 有时候我们在用 Requests 抓取页面的时候,得到的结果可能和在浏览器中看到的是不一样的,在浏览器中可以看到正常显示的页面数据,但是使用 Requests 得到的结果并没有,这其 ...
-
Docker的安装(6-13)
摘自<Docker-从入门到实践> 一.Docker的安装 准备工作 系统要求 Docker CE 支持以下版本的 Ubuntu 操作系统: Artful 17.10 (Docker CE ...