fancydeepin
毋意,毋必,毋固,毋我。
BlogJava
首页
新随笔
联系
聚合
管理
随笔-126 评论-247 文章-5 trackbacks-0
开闭原则(OCP)
所谓的
开闭原则
(Open-Closed Principle,简称 OCP)
说的是:
软件实体(类、模块、功能等)应该可以被扩展,但不可被修改。
开闭原则说白了就是,应该在不修改现有代码的基础上,引入新功能。
开闭原则中的“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中的“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
而实际上,要做到百分之百的封闭是不可能的,但是在系统设计的时候,还是应该尽量做到这一点。
一个简单的例子,假设现在需要实现一个加法的功能,很简单,如图示1:
现在的问题是,需求变了,要求还要实现一个减法的功能,这也很简单,如图示2:
如果需求再变,还要求能实现乘法和除法的功能,依然简单,如图示3:
从第2和第3步来看,很明显,在需求改变,需要引进新的功能的时候,做法是在已有的类的基础上通过新添方法来实现功能,假设在第2步之后,第3步的时候发现加法和减法功能
最终都没有用到,反而乘法和除法需要用到,那么在第3步的时候就要推翻第2步之前的实现,在需求发生改变需要引进新的功能的时候,就要推翻整个之前的系统,很明显这样的做法
是不可取的,说明设计上出现了问题,这个缺陷明显的是违反了OCP(开闭原则)。
需求总是在变的,如果可能,就要做到尽量不要去修改已有的实现,而应该通过扩展的手段来稳定需求的变动。
OCP原则替换图2:
OCP原则
替换图3:
在我们最初编写代码的时候,我们假设变化不会发生,但最后变化发生的时候,可以通过创建抽象来隔离以后将要发生的同类变化。
开闭原则是面向对象设计中“可复用设计”的基础,是面向对象设计中最重要的原则之一。 从开闭原则中可以看出,面对对象的重要原则是创建抽象化,并且从抽象化中导出
具体化,具体化可以有许多不同的版本,而每个不同的版本可以给出不同的实现。
posted on 2012-08-02 11:03
fancydeepin
阅读(864)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
github
个人主页
beanutil
jutil
jexcel
orc
随笔分类
(8)
junit
maven(8)
随笔档案
(104)
2015年6月 (8)
2015年2月 (1)
2015年1月 (1)
2014年9月 (1)
2014年8月 (3)
2014年6月 (10)
2014年5月 (3)
2014年3月 (5)
2013年10月 (1)
2013年9月 (2)
2013年4月 (1)
2013年3月 (2)
2013年2月 (11)
2012年11月 (3)
2012年10月 (14)
2012年8月 (15)
2012年7月 (13)
2012年6月 (10)
最新随笔
1. maven 为测试环境、生产环境等不同环境打包
2. maven 多模块项目
3. nexus 搭建 maven 私服
4. maven 镜像
5. maven jetty 插件使用
6. maven jdk 版本配置
7. eclipse maven plugin 插件 安装 和 配置
8. maven 安装
9. ORCP : 从数据库表到 java 对象生成的 eclipse 插件
10. jexcel 读写EXCEL
11. linux 系列
12. spring mvc(2):请求地址映射(@RequestMapping)
13. spring mvc(1):基础入门
14. Java 验证码、二维码
15. GXT —— TreePanel 组件(一)
搜索
积分与排名
积分 - 1459439
排名 - 15
最新评论
1. re: Maven 手动添加 JAR 包到本地仓库[未登录]
刚安装好的maven,仓库里没有jar包,如何添加jar包呢?
--Firefly
2. re: java 建造者模式(Builder)
多谢,讲的很清楚
--Nimo
3. re: Maven 手动添加 JAR 包到本地仓库
很好很强大, 完美的解决了我的问题。。。
--klose
4. re: eclipse maven plugin 插件 安装 和 配置
@fancydeepin
链接还是失效了啊
--菜鸟一号
5. re: Maven 手动添加 JAR 包到本地仓库[未登录]
@呼吸~
你好,请问,怎么设置代理呢?
--paul
阅读排行榜
1. eclipse maven plugin 插件 安装 和 配置(325693)
2. Maven 手动添加 JAR 包到本地仓库(199567)
3. Lombok 安装、入门 - 消除冗长的 java 代码(154801)
4. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?(70138)
5. maven jetty 插件使用(49019)
6. JSP/Servlet 工作原理(43088)
7. maven jdk 版本配置(40957)
8. spring mvc(2):请求地址映射(@RequestMapping)(39521)
9. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ](31203)
10. maven 多模块项目(27831)