阅读本文大概需要 3 分钟。

本篇是设计模式系列的第九篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。

所以现在打算重写,加上距离现在也有一段时间了,也算是自己的一个回顾吧!

学而时习之,不亦说乎。

推荐阅读:

从零开始单排学设计模式「装饰模式」黑铁 I

目前段位:青铜 I - 白银 III 晋级赛

Let's Go!

前言

设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活。架构模式比设计模式大,架构模式是战略,而设计模式是战术。

设计模式(面向对象设计)中有6大原则,分别是:单一职责原则、里氏替换原则、依赖倒转原则、接口隔离原则、迪米特法则、开放-封闭原则。

开放-封闭原则

开放-封闭原则(开-闭原则):软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。

软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。

软件实体包括以下几个部分: 1.项目或软件产品中按照一定的逻辑规则划分的模块 2.抽象和类 3.方法。

深入理解

开闭原则怎么能更深入的理解呢?还是说说我们身边的例子吧。

比如我们平常喝水用的一次性纸杯。平常人只是用来装水。喝完水就扔了。这就是这个纸杯的生命周期。纸杯这一生只完成了它的一个功能:装水。纸杯此时就很封闭了,没有什么扩展性。

此时,我看到身边有一支花苗,我想要拿回家种。但是没有容器呀?啊?旁边不是有一个纸杯吗,可以用此纸杯来种这朵花苗。纸杯有了它的另外一个扩展性,就是种花苗。

纸杯不仅有装水、种花苗的用途,以后还可以有装小垃圾、冲茶、回收等功能。对于以后这些功能,我们要想到他们的扩张性。

在纸杯只有一个装水的功能的时候,我们只写一个纸杯功能类,说纸杯能装水。但是以后有扩展呢?这一方面我们要预先判断。预先判断它以后可能会根据需求的变动而扩展。对于纸杯本来的装水功能,不能说不能修改,此功能只能在此函数、类中修改。这就是开闭原则的核心。

所以,纸杯在开闭原则所体现的是:尽量少修改,未来可能扩展的模块、类做好预算的判断。如果要修改,只能在此函数此类修改,不能牵涉到其他地方。

下面,我们用UML类图来直观地说明一下纸杯的设计吧。

当纸杯只有一个功能,装水时。有一个纸杯操作接口,有一个纸杯操作实现类。

当我们要添加一个功能 种花苗时,我们不也是加一个方法吗?如下:

当添加N个方法时,不也是在纸杯的操作接口上面添加N个方法吗?

我们想一想,此时已经背离了我们的开闭原则。因为每添加一个方法,都要在操作类上面做修改。所以,我们按照开闭原则,开做了以下合理的设计:

从上面可以看出,我们把纸杯的操作类,统一写成一个接口,每个不同的操作继承此接口来完成各自操作。我们还开到多了一个类,叫客户端类,其实此类也不难理解。也就是要最终操作纸杯的类。

其他例子

开闭原则其实在大话设计模式中说得非常好,让人通俗易懂。它举了一个例子,我觉得说得非常好。是加减乘除法的例子。

开始需求是做一个加法的操作。后来继续加入减法、乘法、除法。开始我们想加法以后可能会做一个需求变更:加入其它的算法法则。所以我们要有一个预判性,这个预判性会导致我们项目以后的扩展性,也会导致如果需求发生变更,程序修改的难易程度。

所以,我们要做一个算法法则的操作类,加减乘除法都继承此操作接口。再加一个算法法则的客户端类类操作此算法。

我们来上一下大话设计模式中的图:

总结

开闭原则是我们面向对象设计的目标,我们灵活地运用好此目标也不是易事。所以开闭原则要深入的理解,才能做好面向对象的编程,才能做一个好的软件。

往期精彩回顾

程序员接私活的7大平台利器

面试时如何优雅地自我介绍?

支撑百万并发的数据库架构如何设计?

如何向大牛请教问题?

为何IntelliJ IDEA比Eclipse更好

巧用这19条MySQL优化,效率至少提高3倍

想囤书的赶紧看过来(精选书单)

IDEA一定要懂的32条快捷键

世上最污技术解读,我竟然秒懂了

一千行MySQL详细学习笔记

七点建议助您写出优雅的Java代码

从零开始单排学设计模式「开发-封闭原则」青铜 - 白银 晋级赛相关推荐

  1. 从零开始单排学设计模式「UML类图」定级赛

    阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...

  2. 从零开始单排学设计模式「UML类图」定级赛 1

    阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...

  3. 从零开始单排学设计模式「策略模式」黑铁 II

    阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了, ...

  4. 从零开始单排学设计模式「简单工厂设计模式」黑铁 III

    阅读本文大概需要 2 分钟. 本篇是设计模式系列的第二篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算 ...

  5. 从零开始单排学设计模式「装饰模式」黑铁 I

    阅读本文大概需要 3.6 分钟. 本篇是设计模式系列的第四篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

  6. 从零开始单排学设计模式「代理模式」青铜 III

    阅读本文大概需要 3.2 分钟. 本篇是设计模式系列的第六篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...

  7. 设计模式之开放封闭原则

    以下皆是个人理解如有不对请留言指出,谢谢! 我就代码提出我自己个人的看法: 正常定义一个类例如银行工作员,他可以执行存款,付款和转账功能,如果在现有功能上我想添加贷款功能,需要在类中添加新的功能对应的 ...

  8. 元宇宙,分三层!香港中文大学再现「校园元宇宙」原型

    在过去的几个月里,「元宇宙」一词屡屡登上热点. 元宇宙一个 3D 虚拟空间,用户可以通过他们的化身与其他人和软件应用程序进行交互.虚拟现实和增强现实等多媒体技术的快速发展无疑加速了元宇宙的发展. 同时 ...

  9. 【深入浅出Spring原理及实战】「开发实战系列」带你看看那些可能你还不知道的Spring特殊技巧和想不到的招数

    前提介绍 本文主要介绍相关Spring框架的一些新特性问题机制,包含了一些特定注解方面的认识. @Lazy可以延迟依赖注入 @Lazy注解修饰在类层面! @Lazy @Service public c ...

最新文章

  1. rabbitmq实战指南 pdf_企业服务智能用户运营实战指南.pdf
  2. 《Flex 3程序设计》——Adobe技术专家力作
  3. Integration testing
  4. String Modification CodeForces - 1316B(规律)
  5. 第五十六期:IPv6只是增加了地址数量?其实真相并没有那么简单!
  6. 2021 ISC会上山石网科重磅发布智能下一代防火墙A系列,重新定义边界安全防御
  7. 从自监督到全监督!Google 提出新损失函数SupCon,准确率提升2%!
  8. Sublime Text 3 注册码
  9. 3DEC离散元数值模拟技术与应用
  10. Gambit 1.Gambit环境
  11. php十六进制加1,二进制110000转化为十六进制
  12. 音乐API(仅测试使用)
  13. 传统广域网有什么特点?传统广域网面临哪些挑战?
  14. 著名的光伏系统设计——pvsyst7.2中文版
  15. 自由修改机型名称、手机型号工具-QQ微博尾巴装X神器
  16. 图像二值化方法及适用场景分析(OTSU Trangle 自适应阈值分割)
  17. win10专业版 hyper-v 找不到
  18. Elasticsearch之中文分词器插件es-ik的自定义热更新词库
  19. 视频收集、视频征集、视频采集、征集视频、收集视频、采集视频工具/小程序
  20. OPC:客户端开发——应用WTclient.dll使用手册部分中文版

热门文章

  1. 软件测试-金融银行项目怎么测?系统业务测试总结分析...
  2. SQL注入-整型注入实例
  3. select语句如何过五关斩六将
  4. h5 微信头像图片获取模糊问题
  5. Nelder-Mead算法【数学规划】
  6. 记一次java奇葩错误 Property [XXX] not found on type
  7. 腾讯云数据库品牌升级,大咖解读数据库三大变化
  8. 三国演义之桃园三结义
  9. 分组密码算法分析,改进
  10. 免费物流轨迹查询 对接接口