类设计原则之 - 开闭原则
OCP , Open Closed Principle , 中文翻译为 开闭原则
当第一次看到 OCP 时,我就蒙了,什么开,什么闭啊,完全摸不到头脑
然后就去网上找各种博客,各种解释,最多的一种就是:
对扩展开放,对修改关闭
当时我就更蒙了,去问了很多“高手”,他的回答让我更加迷茫:
不修改代码就可以增加新功能
这是多么神奇的事啊,不修改代码就能增加新功能
但问题是:怎么做到的呢? 不修改代码就能增加新的功能,难道像人工智能一样,会自动学习?又或者有什么高超的技巧?
越是好奇,越是想要弄明白 ,这么“神奇”的原则当然要继续探索了,但是怎么也没有找到 “不修改代码就能增加新功能” 的秘籍
对于这个原则开始有了怀疑,经过继续探索与各种查资料,才发现原来那些 “高手” 以及各种博客上的解释,是少了一个主语
而这才是 OCP (开闭原则) 的关键
大师们省略的主语是一个 消费者
, 另一个就是 生产者
了,也可以叫做提供者
例如 : A 类调用了 B 类的方法,A类就是消费者
, B类就是提供者
重新表述 开闭原则
所以完整的 开闭原则
应该这样来表述: 对使用者修改关闭,对提供者扩展开放
更通俗的意思就是:提供者增加新的功能时,使用者不需要修改代码
但是读者可能又有了疑问: 提供者增加了新的功能,使用者不修改代码就真的能用上吗?
比如:一个 Car 类,有 加速
, 刹车
功能, 现在增加了一个 倒车
功能
如果其它模块要使用这个 Car
类,不修改代码就可以用上倒车
功能吗?
很显然这是不可能的, 我都新加了一个函数,你都不调用 ,你怎么用上我的新功能?
答案就在于:新增加的功能
并不是增加一个全新的功能,但是在原来的功能中有了替代
比如继续以轿车为例子:假设现在有了 卡车
, 跑车
,家用车
三款车
现在要增加一种 卡丁车
, 只要 卡丁车
实现了 加速
, 刹车
,那么使用者就不需要修改代码,就可以玩 卡丁车了
但如果你增加了一种 漂移
功能,那么使用者就必须修改代码才能使用 漂移
功能了。
对应到代码上来说,开闭原则
(OCP) 应用原则如下:
接口不变:包括函数名,函数参数,返回函数等, 可以使用 OCP
接口改变:已有函数修改名称,参数,返回值,或者增加新的函数,OCP都不再适用
虽然 OCP 是针对类设计提出来的原则 ,但是其思想其实适用很广,系统和子系统,子系统和子系统,模块和模块之间都可以应用OCP
而且不同的地方应用其实都 遵循同一个原则:通过接口交互
! 比如
- 类与类之间应用 OCP :使用 interface 进行交互
- 模块和模块,系统和系统之间 : 使用规定好的协议,不管是私有的还是公开的,例如 HTTP , RTCP
小结
OCP ,也即 开闭原则
: 对使用者修改关闭,对提供者扩展开放
开闭原则应用很广
- 类与类之间用 interface进行交互
- 模块与模块,系统与系统之间,使用规定好的协议