彻底弄懂类设计原则之 - 开闭原则

待兔
• 阅读 1819

类设计原则之 - 开闭原则

OCP , Open Closed Principle , 中文翻译为 开闭原则

当第一次看到 OCP 时,我就蒙了,什么开,什么闭啊,完全摸不到头脑

然后就去网上找各种博客,各种解释,最多的一种就是:

对扩展开放,对修改关闭

当时我就更蒙了,去问了很多“高手”,他的回答让我更加迷茫:

不修改代码就可以增加新功能

这是多么神奇的事啊,不修改代码就能增加新功能

但问题是:怎么做到的呢? 不修改代码就能增加新的功能,难道像人工智能一样,会自动学习?又或者有什么高超的技巧?

越是好奇,越是想要弄明白 ,这么“神奇”的原则当然要继续探索了,但是怎么也没有找到 “不修改代码就能增加新功能” 的秘籍

对于这个原则开始有了怀疑,经过继续探索与各种查资料,才发现原来那些 “高手” 以及各种博客上的解释,是少了一个主语

而这才是 OCP (开闭原则) 的关键

大师们省略的主语是一个 消费者 , 另一个就是 生产者 了,也可以叫做提供者

例如 : A 类调用了 B 类的方法,A类就是消费者, B类就是提供者

重新表述 开闭原则

所以完整的 开闭原则 应该这样来表述: 对使用者修改关闭,对提供者扩展开放

更通俗的意思就是:提供者增加新的功能时,使用者不需要修改代码

但是读者可能又有了疑问: 提供者增加了新的功能,使用者不修改代码就真的能用上吗?

比如:一个 Car 类,有 加速 , 刹车 功能, 现在增加了一个 倒车 功能

如果其它模块要使用这个 Car 类,不修改代码就可以用上倒车 功能吗?

很显然这是不可能的, 我都新加了一个函数,你都不调用 ,你怎么用上我的新功能?

答案就在于:新增加的功能 并不是增加一个全新的功能,但是在原来的功能中有了替代

比如继续以轿车为例子:假设现在有了 卡车 , 跑车 ,家用车 三款车

现在要增加一种 卡丁车 , 只要 卡丁车 实现了 加速刹车 ,那么使用者就不需要修改代码,就可以玩 卡丁车了

但如果你增加了一种 漂移 功能,那么使用者就必须修改代码才能使用 漂移功能了。

对应到代码上来说,开闭原则(OCP) 应用原则如下:

  • 接口不变:包括函数名,函数参数,返回函数等, 可以使用 OCP

  • 接口改变:已有函数修改名称,参数,返回值,或者增加新的函数,OCP都不再适用

虽然 OCP 是针对类设计提出来的原则 ,但是其思想其实适用很广,系统和子系统,子系统和子系统,模块和模块之间都可以应用OCP

而且不同的地方应用其实都 遵循同一个原则:通过接口交互 ! 比如

  • 类与类之间应用 OCP :使用 interface 进行交互
  • 模块和模块,系统和系统之间 : 使用规定好的协议,不管是私有的还是公开的,例如 HTTP , RTCP

小结

OCP ,也即 开闭原则 : 对使用者修改关闭,对提供者扩展开放

开闭原则应用很广

  • 类与类之间用 interface进行交互
  • 模块与模块,系统与系统之间,使用规定好的协议
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java之设计模式
看了设计模式,感觉自己很多不理解什么意思,通过看博客别人写的理解,总结了一下,方便查阅。一、设计模式六大原则1、单一职责原则:定义:应该有且只有一个原因引起类的变化。注意:这里的类不光指类,也适用于方法和接口,比如我们常说的一个方法实现一个功能。2、开放封闭原则:定义:类、模块、函数等
zdd小小菜鸟 zdd小小菜鸟
2年前
设计模式–六大原则
设计模式–六大原则tex在238中设计模式中,我们提炼出了六大面向对象设计原则我们可以不知道那数量繁多的设计模式,但一定要记住这六大设计原则1.开闭原则(OpenClosePrinciple
zdd小小菜鸟 zdd小小菜鸟
2年前
设计模式面试
设计模式面试1.单例设计模式使用设计模式为了代码复用,增加可维护性。设计模式的六大原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则(最少知道原则)、合成/聚合复用原则Singleton(创建):保证一个类仅
xiguaapp xiguaapp
3年前
一句话总结java七大设计原则
开闭原则:对扩展开放,对修改关闭。依赖倒置原则:高层应该不依赖地层。单一职责原则:一个类只干一件事儿。接口隔离原则:一个接口只干一件事儿迪米特法则:不该知道的就不要知道。里氏替换原则:子类重写方法功能发生改变,但是不影响父类方法的语义。合成复用原则:尽量使用组合实现代码复用,不要用继承,要解耦。
待兔 待兔
2年前
彻底弄懂类设计原则之 - 单一职责原则
类设计原则之单一职责类的设计原则之单一职责原则,是最常用的类的设计的原则之一英文:SRP,SimpleResponsibilityPrinciple中文:单一职责原则这是面向对象类设计中的第一个原则,也是看起来最简单的一个原则,但是实际上远远没有这么简单,很多人不一定真正理解了!类设计,通俗的讲就是怎么去写一个类更好,应该遵循什么样的原则
Wesley13 Wesley13
3年前
Go切片的开闭原则
Go切片的开闭原则前言今日在工作中踩了一个小坑,关于数组切片的,主要是切片开闭原则的,当年面试的时候考过,但是后来没有仔细研究,这里补足一下。示例packagemainimport"fmt"funcmain(){//程序运行完成时一定要有输
Wesley13 Wesley13
3年前
GOF二十三种设计模式之工厂模式
先说一下面向对象设计的基本原则:OCP:开放原则,一个软件的实体应当对扩展开放,对修改关闭。DIP:依赖倒转原则,针对接口编程,不要针对实现编程。LoD:迪米特法则,只与直接相关的类通信,避免和陌生人通信。在平常的编程中,我们都是直接new一个对象,而在工厂模式中,将对象的创建统一进行管理和控制,将调用者与实现类进行解耦。下边是一个简单的
Wesley13 Wesley13
3年前
Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦。详细分类:1)简单工厂模式(静态工厂模式);2)工厂方法模式;3)抽象工厂模式面向对象设计的基本原则:1)      OCP(开闭原则,OpenClosedPrinciple):一个软件的实体应当对扩展开放,对修改关闭。2)      
Stella981 Stella981
3年前
Spring IOC分析
前言   关于Spring,我想无需做太多的解释了。每个Java程序猿应该都使用过他。Spring的ioc和aop极大的方便了我们的开发,但是Spring又有着不好的一面,为了符合开闭原则,Spring的一个方法可以涉及到好几十个类,从设计上来说,这样的设计易于宽展,职责明确。但从开发角度而言,Spring就像一个迷宫,经常会在里面
Stella981 Stella981
3年前
Python装饰器、内置函数之金兰契友
装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种。所以也可以理解装饰器是一种特殊的函数。因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展,而对源代码的修改是封闭的。开放封闭原则主要体现在两个方面:对功能扩展开放:意味着有新的需求或变化时,可以对现有代码进行扩展,以适