设计模式之六大设计原则

为什么要学习设计模式?

要知道设计模式就是软件工程的方法经验的总结,也是可以认为是过去一段时间软件工程的一个最佳实践,要理解,不要死记硬背。掌握这些方法后,可以让你的程序获得以下好处:

  • 代码重用性(相同功能的代码,不用多次编写)
  • 可读性(编程规范性,便于其他程序员的阅读和理解)
  • 可扩展性(当需要增加新的功能时,非常的方便,称为可维护)
  • 可靠性(当我们增加新的功能后,对原来的功能没有影响)
  • 使程序呈现高内聚,低耦合的特性。

当然设计是有限度的,不能无限的考虑未来的变更情况,否则就会陷入设计的泥潭而无法自拔。方法是死的,人是活,用的时候一定灵活运用,才能发挥它的作用。设计模式中六大设计原则,这些原则可以认为是设计模式的灵昏。下面先对六大设计原则简单梳理一下,然后再详细分析每一个设计原则。

设计模式的六大原则

  1. 单一职责原则:一个类或一个接口只干一件事,要实现类的职责单一,这也可以延伸到对方法的理解上,主要目的是为了便于理解代码的业务含义,提高代码的可读性;
  2. 里氏替换原则:里氏替换原则的本质是描述父类与子类之间的继承规则,子类对象无论何时都能替换父类对象,子类可以扩展父类的功能,但不能改变父类原有的功能,主要目的是为了防止继承泛滥,增强程序的分健壮性;
  3. 依赖倒置原则:是指高层不应该依赖低层,要面向接口编程,主要目的是为了方便的对代码结果进行升级扩展;
  4. 接口隔离原则:即用多个专门的接口,而不是用单一的总接口,客户端不应该依赖它不需要的接口,主要目的是功能解耦,高聚合、低耦合;
  5. 迪米特法则:一个类对自己所依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,只和朋友交流,不和陌生人说话,减少代码臃肿
  6. 开闭原则:对扩展是开放的,对修改是关闭的,主要目的是为了降低维护带来的新风险;

单一职责原则

单一职责:一个类或接口只负责一项职责

好处:

  1. 类的复杂性降低,实现什么职责、具备什么功能都有清晰明确的定义;
  2. 可读性提高:类之间的复杂性降低,可读性就提高了;
  3. 可维护性提高:可读性提高了,也就更便于维护;
  4. 变更引起的风险降低:类或接口具有单一的功能职责,变更的范围变小,受影响的范围也小,风险也就变低了;

单一职责是几个设计原则里最简单,最容易理解,也是最不好把握的,因为职责的划分是仁者见仁,智者见智的,如果职责划分的颗粒度较粗,那就不符合单一职责的原则,或者失去了单一职责原则的意义;如果职责划分的颗粒度较细,也不太好,会引起类或接口的剧增,有过度设计的嫌疑,给维护带来一定的麻烦;因此,在单一职责这个原则上,是需要把据一定的灵活性的,毕竟原则是死的,人是活的嘛。

里氏替换原则

里氏替换原则的目的是增加程序的健壮性,核心思想是所有引用基类的地方必须能够透明地使用子类的对象,具体则体现在四个方面:

  1. 子类必须完全的实现父类的方法;
  2. 子类也可以有自己的个性;
  3. 覆盖或实现父类的方法时,输入参数可以被放大;
  4. 覆盖或实现父类的方法时,返回值类型可以被缩小;

好处:

  1. 加强程序的健壮性
  2. 版本升级时可以做到很好的兼容性,增加子类,原有的子类还可以继续运行;

开闭原则

开闭原则:一个类、接口或方法,对扩展是开放的,对修改是关闭的,具体点就是用抽象来构建框架,用实现来扩展细节,即尽量通过扩展实体的行为来实现变化,而不是通过修改现已有代码来实现变化。相信很多同学对这点是深有体会的,就是在维护一段有很多人反复维护修改过的代码的时候,每一个来改的人改之前都要口士芬芳一番,然后无可奈何的接受现状。

我认为开闭原则是仅次于单一职责的最简单、最需要被实践的原则,虽然简单,但是好处可大大的不简单:

  1. 提高软件产品的稳定性:开闭原则要求保持原有代码不变,添加新代码来实现软件的变化,这样可以避免改坏线上功能的情况,避免老用户的流失。
  2. 不影响原有测试代码的运行:遵守开闭原则,软件的变化,不会影响到原有的测试代码,避免测试出错。
  3. 提高代码的可复用性:面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
  4. 提高软件的可维护性:开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
  5. 使代码更具模块化,易于维护:开闭原则可以让代码中的各功能,以及新旧功能独立存在于不同的单元模块中,一旦某个功能出现问题,可以很快地锁定代码位置作出修改,由于模块间代码独立不相互调用,更改一个功能的代码也不会引起其他功能的崩溃。

依赖倒置原则

依赖倒置原则的核心是面向接口接口编程,主要体现在几个方面:

  1. 高层模块不应该依赖低层模块,两者都应该依赖抽象;
  2. 抽象不应该依赖细节,细节应该依赖抽象;
  3. 依赖关系通过抽象类或接口实现,实现类之间不直接发生依赖关系;
  4. 接口或抽象类不依赖于实现类,实现类依赖接口或抽象类;

好处:

  1. 降低类间的耦合性:依赖倒置原则可以降低类间的耦合性,使得代码更加健壮,更加耐久。
  2. 提高系统的稳定性:依赖倒置原则可以提高系统的稳定性,使得代码更加稳定可靠。
  3. 减少并行开发引起的风险:依赖倒置原则可以减少并行开发引起的风险,使得并行开发更加高效。
  4. 提高代码的可读性和可维护性:依赖倒置原则可以提高代码的可读性和可维护性,使得代码更加易于理解和维护。

接口隔离原则

接口隔离原则是指类或接口间的依赖应该建立在最小接口上,具体就是:

  1. 一个类对一个类的依赖应该建立在最小的接口之上;
  2. 要建立单一的接口,不要建立庞大臃肿的接口;
  3. 接口要尽量细化,接口中的方法要尽量的少,而不要建立一个庞大的接口供很多的依赖类来调用;

这里有的小伙们可能就有疑问了,这好像与单一职责有点类似呀!是的,确实有点类似,但是完全不同,单一职责强调的是类和接口的职责要单一,并没有强调接口的方法也要少,而接口隔离原则强调的是接口方法的松散程度;

  1. 降低耦合度:接口隔离原则将接口细化,减少了不相关的方法和依赖关系,降低了模块之间的耦合度。
  2. 提高灵活性:通过细粒度的接口定义,系统更容易适应变化,可以灵活地替换实现,而不影响其他部分的代码。
  3. 增强可维护性:接口隔离原则使得代码更加清晰、可读性更高,便于理解和维护。
  4. 提高代码复用性:通过接口的细化和适配器模式的使用,可以实现接口的复用,减少重复代码的编写。

迪米特原则

迪米特法则又叫 最少知道原则,即一个类对自己所依赖的类知道的越少越好。具体表现:

  1. 对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何细节信息。
  2. 两个实体间无需直接通信,可以通过第三方进行间接调用。
  3. 迪米特法则还有一个更简单的定义:只与直接的朋友通信。那什么是“直接朋友”呢?直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。我们称出现成员变量、方法参数、方法返回值中的类为直接朋友,而出现在局部变量中的类不是直接朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

好处:

  1. 降低类之间的耦合度:迪米特原则要求限制对象之间的直接交互,减少对象之间的依赖关系,避免出现复杂的交互关系和耦合度高的代码。
  2. 提高模块的相对独立性:通过迪米特原则,我们可以将对象之间的依赖关系转化为通过第三者间接交互,增加了系统的独立性和可维护性。
  3. 提高类的可复用率和系统的扩展性:由于迪米特原则降低了类之间的耦合度,使得类更加独立和可复用,同时也使得系统更加易于扩展和维护。

总结

最后,还是要强调一点,设计原则和设计模式绝对不是灵丹妙药,全用上就是好。当然设计原则有人理解是六种,也有理解是七种的。不管理解是几种,设计模式和设计原则属于方法论的内容,是要帮助我们解决具体的业务问题的,当然需要具体问题具体对待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】38. 外观数列

1 问题 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) “1” countAndSay(n…

kali使用docker安装DVWA

上一篇文章我记录了如何使用kali安装DVWA,但是我是一个一个组件安装的,非常麻烦,比如数据库还需要配置,花费时间很多。昨天在逛github时,发现大佬的靶场都是通过docker打包好的,如果我也用docker安装DVWA&a…

4.4 网际控制报文协议ICMP

思维导图: 4.4 网际控制报文协议ICMP - 笔记 --- **定义**: - 网际控制报文协议ICMP(Internet Control Message Protocol)是根据[RFC 792]定义的一种协议。它的主要功能是为了提高IP数据报的转发效率和确保交付的成功率。 **主要功能**: 1. **差错报告**: ICMP允…

阿里云starrocks监控告发至钉钉群

背景:新入职一家公司,现场没有对sr的进行监控,根据开发的需求编写了一个python脚本。 脚本逻辑:抓取sr的be/fe/routine load状态信息,判读是否触发告警,若满足告警条件,则发送告警信息到钉钉群…

二维码智慧门牌管理系统:确保数据准确,强制校验GPS信号强度

文章目录 前言一、数据采集多种方式二、提高工作效率与管理效率 前言 在快速发展的科技时代,我们推出了一款最新的门牌系统解决方案——二维码智慧门牌。这款门牌不仅具备高效的管理功能,还为入口管理提供全新的智慧化解决方案。 一、数据采集多种方式 …

【Arduino TFT】 记录使用DMA优化TFT屏帧率

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-18 ❤️❤️ 本篇更新记录 2023-10-18 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝&#x1f64…

【马蹄集】—— 概率论专题

概率论专题 目录 MT2226 抽奖概率MT2227 饿饿!饭饭!MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度:黄金    时间限制:1秒    占用内存:128M 题目描述 小码哥正在进行抽奖,箱子里有…

Transformer模型 | Transformer模型描述

谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快…

身份证二要素核验API:提高身份验证的便捷性与安全性

引言 随着数字化时代的不断发展,身份验证变得愈发重要。在互联网上,身份验证是保护用户隐私和数据安全的关键环节。为了满足这一需求,身份证二要素核验API应运而生,成为提高身份验证的便捷性与安全性的得力工具。 身份验证的重要…

大数据Hadoop之——部署hadoop+hive+Mysql环境(window11)

一、安装JDK8 【温馨提示】对应后面安装的hadoop和hive版本,这里使用jdk8,这里不要用其他jdk了,可能会出现一些其他问题。 1)JDK下载地址 Java Downloads | Oracle 按正常下载是需要先登录的,这里提供一个不用登录下载…

GLEIF携手TrustAsia,共促数字邮件证书的信任与透明度升级

TrustAsia首次发布嵌入LEI的S/MIME证书,用于验证法定实体相关的电子邮件账户的真实与完整性 2023年10月,全球法人识别编码基金会(GLEIF)与证书颁发机构(CA)TrustAsia通力合作,双方就促进LEI在数…

vscode使用

vscode 快捷键1、ctrl f 文件内搜索2、ctrlp 快速打开最近打开的文件3、ctrlshiltn 打开新的编辑器窗口4、ctrlshiftw 关闭编辑器5、ctrlhome 跳转到页头6、ctrlend 跳转到页尾 插件1、Markdown Preview 参考文章 https://zhuanlan.zhihu.com/p/113222681?utm_sourcecom.tenc…

米哈游、复旦发布,具备感知、大脑、行动的大语言模型“智能体”

ChatGPT等大语言模型展示了前所未有的创造能力,但距AGI(通用人工智能)还有很大的距离,缺少自主决策、记忆存储、规划等拟人化能力。 为了探索大语言模型向AGI演变,进化成超越人类的超级人工智能,米哈游与复…

SpringBoot集成Activiti7

SpringBoot集成Activiti7 SpringBoot版本使用2.7.16 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.16</version><relativePath/> <!-- lookup…

OTP语音芯片和TTS语音芯片的差异性

OTP&#xff08;One-Time Programmable&#xff09;语音芯片和TTS&#xff08;Text-to-Speech&#xff09;语音芯片是两种不同类型的声音处理芯片。OTP主要用于播放预录声音片段&#xff0c;而TTS则根据文本实时生成语音。OTP的灵活性较弱&#xff0c;适用于固定声音输出&#…

05 依赖倒置原则

官方定义&#xff1a; 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff0c;DIP&#xff09;是指在设计代码架构 时&#xff0c;高层模块不应该依赖于底层模块&#xff0c;二者都应该依赖于抽象。抽象不应该依 赖于细节&#xff0c;细节应该依赖于抽象。 通俗…

深度学习 | CNN卷积核与通道

10.1、单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。 假设卷积核大小为3x3&#xff0c;padding0&#xff0c;stride1。 运算过程&#xff1a; 不断的在图像上进行遍历&#…

Ask Milvus Anything!聊聊被社区反复@的那些事儿ⅠⅠ

在上月的 “Ask Milvus” 专题直播中&#xff0c;我们为大家带来了 Backup 的技术解读&#xff0c;收到了社区成员很多积极的反馈。本期直播&#xff0c;我们将继续为大家带来社区呼声很高的 “Birdwatcher” 和 “Range Search” 两项功能的技术解读。 BirdWatcher 作为 Milvu…

Eolink Apikit 接口自动化测试流程

自动化测试是一种软件测试方法&#xff0c;利用自动化工具和脚本来执行测试用例&#xff0c;以验证软件应用程序的功能、性能、稳定性等特性。自动化测试的主要目的是提高测试效率、减少测试成本&#xff0c;并确保软件的质量和可靠性。 作为测试人员&#xff0c;在进行比较大…

国际十大优质期货投资app软件最新排名(综合版)

在当今的金融市场中&#xff0c;期货投资成为了越来越多人的选择。随着科技的发展&#xff0c;许多优质的期货投资app软件也应运而生。这些软件不仅提供了便捷的投资交易工具&#xff0c;还为投资者提供了丰富的市场分析和风险管理手段。 本文将介绍国际十大优质期货投资app软…