【设计模式攻略】OO设计原则之OCP-开放-关闭原则
来源:互联网 发布:unity3d webplayer 编辑:程序博客网 时间:2024/06/06 05:01
概要
何谓开放关闭,其实就是对扩展是开放的,对修改是关闭的。前半句好理解,后半句什么意思?进一步说明,就是扩展的同时对固有既定模块是不需要再修改的,如果还要问什么是固有既定模块,抱歉,文字还真不好解释,到后面穿插实例再来说明吧。目的
对扩展开发,对修改关闭
实例与效果
先看个例子,比如我们需要一个封装访问MySql数据库的类。定义一些数据库操作API供外部调用,代码和类图如下所示:
class Database {public: void connect(); void execute(); void commit(); void rollback();};
然后你兴致勃勃地开始用了。然后有一天,需求又增加了,需要支持SQL Server了,你可能觉得,这很简单,类里加个Type参数,if-else区别处理,然后搞定。但是,需求继续膨胀,SQLite,Oracle.....都要支持,好,继续else-if,else-if的加吧,加着加着你突然发现原来运行正常的MySql出现异常了,debug半天发现原来耦合太多,你改着改着就把原来既有的改错了。让我们一起来反省下,如果开始就考虑下OCP呢?卡看这样做是不是更好。
class IDatabase {public: virtual void connect() = 0; virtual void execute() = 0; virtual void commit() = 0; virtual void rollback() = 0;};class MySqlDB : public IDatabase {public: virtual void connect(); virtual void execute(); virtual void commit(); virtual void rollback();};
好,让需求变化的更疯狂些吧, SQL Server, SQLite,Oracle.....只是每次追加一个继承于 IDatabase独立的类而已,而既有的数据库封装类是不需要任何改动的。这里的 IDatabase, MySqlDB就属于前面所谓的固有的既定模块,而它们在你扩展时是不受影响的。而调用方Client,也只是需要改变创建的数据库对象而已。
现在关于OCP,有那么点感觉了吧?这就是所谓的对扩展开放,对修改关闭。
最后声明一点, 所有OO原则都是个宏观的概念,而我所 举的例子都相对比较片面,像这个例子说白了也就是个多态的应用罢了,只算个特例而已。
- 【设计模式攻略】OO设计原则之OCP-开放-关闭原则
- IOS设计模式的六大设计原则之开放-关闭原则(OCP,Open-Close Principle)
- 设计模式之开放关闭原则
- 设计模式---开放-关闭原则
- 设计模式之OO原则
- OO设计原则 — The Open-Closed Principle:OO设计的(OCP) 开放/封闭原则
- 设计模式 开放封闭原则 OCP
- 设计模式--开放/封闭原则(OCP)
- 《大话设计模式》之 开放-关闭设计原则
- 设计原则-开放关闭原则
- 【设计模式攻略】OO设计原则之SRP-单一职责原则
- 【设计模式攻略】OO设计原则之LSP-Liskov替换原则
- 【设计模式攻略】OO设计原则之DIP-依赖倒置原则
- 【设计模式攻略】OO设计原则之ISP-接口隔离原则
- JAVA设计模式之OO设计原则
- 设计模式六大原则(5):开放封闭原则(OCP)
- 设计模式六大原则(六)-- 开放封闭原则 ( OCP )
- Head First设计模式之开放-关闭原则
- [易飞]财务表之销售分析
- bcp导入导出sybase数据库的数据
- 深入理解ARM体系架构(S3C6410)---PWM实例
- 简易ping程序
- uva:10003 - Cutting Sticks
- 【设计模式攻略】OO设计原则之OCP-开放-关闭原则
- 学习规划
- 崩溃的程序调试
- 调用COM对象的GetWallpaper()方法。 如果GetWallpaper()成功,则输出/显示墙纸文件名
- 动态语言和静态语言、强类型定义语言和弱类型定义语言、解释型语言、动态语言、脚本语言的概念区分
- 电子游戏能改变人的大脑
- 第二个例子展示了如何使用一个提供单接口的COM对象QueryInterface()函数
- android常见问题之jni读取assets资源文件
- JVM调优参数