面向对象设计原则之开闭原则

免责声明:内容由作者分享,本文编写由 AmyLi 代为执笔。

开闭原则(Open-Closed Principle,OCP)是指软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。

开闭原则

定义

开闭原则(Open-Closed Principle,OCP)是指软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对修改是封闭的。

思想

该原则的思想是:当需要改变一个程序的功能或者给这个程序增加新的功能的时候,可以使用增加代码的方式,但是不允许改动程序的源代码。

符合开闭原则的设计模式

1.发布-订阅模式
2.模板方法模式
3.策略模式
4.代理模式
5.职责链模式

解决的问题

在系统的不断迭代过程中,常常需要增减某个模块的功能,如果直接修改源码,容易造成某一个功能的代码不断变得臃肿,最终导致越来越难以维护。

方法——封装变化

  • 封装变化: 将不变的部分和容易变化的部分隔离开,在系统的演变过程中,替换变化的部分换即可。
  • 埋下 hook: 在程序可能发生变化的地方放置钩子函数,例如 Vue 生命周期钩子
  • 使用回调函数: 调用回调函数的行为是不变的,回调函数内部执行的内容是可变的
  • 提取代码提取成配置文件: 修改配置,而不是源码,如 web 打包的配置,博客系统的配置,页面主题配置

code
code

示例一

有一个让动物发出叫声的函数,它会根据当前是猫还是狗来发出不同的叫声,现在需要支持奶牛的叫声。

code
code

如果需要支持更多的动物,那代码就会变成……

code

在这个示例中动物怎么叫是可变的,动物会叫是不变的,将变化的部分封装起来。

code

这时候要继续支持更多动物的叫声,不需要更改源代码,只需新增对象及方法。代码既易于维护又会很优雅。

code

示例二

给某个函数添加新的功能
code