DIP:依赖反转原则

news/2025/2/6 5:39:33/

系列文章目录

C++高性能优化编程系列
深入理解设计原则系列
深入理解设计模式系列
高级C++并发线程编程

DIP:依赖反转原则

  • 系列文章目录
  • 1、依赖反转原则的定义和解读
  • 2、稳定的抽象层
  • 3、依赖倒置原则和控制反转、依赖注入的联系
  • 小结

1、依赖反转原则的定义和解读

SOILD原则中最后一个原则依赖反转原则(Dependency Inversion Principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。可以理解为依赖反转原则是指高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现,而具体实现应该依赖于抽象。简单来说,就是要依赖于抽象,而不是具体实现

2、稳定的抽象层

我们每次修改抽象接口的时候,一定会去修改对应的具体实现。但反过来,当我们修改具体实现时,却很少需要修改相应的抽象接口。所以我们可以认为接口比实现更稳定。

的确,优秀的软件设计师和架构师会花费很大精力来设计接口,以减少未来对其进行改动。毕竟争取在不修改接口的情况下为软件增加新的功能是软件设计的基础常识。

也就是说,如果想要在软件架构设计上追求稳定,就必须多使用稳定的抽象类接口,少依赖多变的具体实现。

下面是抽象工厂模式解决源代码依赖的问题:

3、依赖倒置原则和控制反转、依赖注入的联系

控制反转(Inversion of Control,IoC)是一种实现依赖倒置原则的具体方式。它是通过将对象的创建、组装和管理交给IoC容器来实现的。在传统的程序设计中,我们通常是手动创建对象并直接调用它们的方法,而在IoC中,对象的创建和调用都是由容器来控制的。容器会在运行时动态地创建对象并将它们注入到需要它们的地方。

依赖注入(DI)是一种实现依赖倒置原则的方法,它通过将依赖对象的创建和管理工作交给外部容器(例如 DI 容器)来实现。依赖注入可以通过构造函数注入、属性注入或方法注入的方式来实现。一般来说,依赖注入使得高层模块不需要知道低层模块的具体实现,而只需要定义依赖接口,将依赖对象的创建和管理交给外部容器。依赖注入可以使得系统更加灵活、可扩展和易于测试,使得代码更易于维护和升级。

小结

下面我们将依赖反转原则归结为以下几点具体的编码守则:

  • 应在代码中多使用抽象接口,尽量避免使用那些多变的具体实现类。对此,我们通常会选择用抽象工厂这个设计模式。
  • 不要在具体实现类上创建衍生类
  • 不要覆盖(override)包含的具体实现函数
  • 应避免在代码中写入与任何具体实现相关的名字,或者是其他容易变动的事物的名字

http://www.ppmy.cn/news/100530.html

相关文章

11、渗透性测试及验收测试

目录 什么是安全测试 安全测试与常规测试的区别 SQL注入漏洞 SQL注入漏洞会带来以下几种常见的后果: SQL注入漏洞攻击流程 注入点类型 SQL注入的防范措施 XSS跨站脚本漏洞 XSS原理解析 XSS类型 1、反射型XSS 2、存储型XSS 3、存储型XSS 查找XSS漏洞的…

安装并新建windows下wxwroks7.0 bootrom工程

双击steup.exe 直接next 直接next 选择typical,然后next I accept 安装完成finish 现在双击Workbench 4,新建vxworks7.0工程,会出现下面的情况,因为没有licence 安装licence,将zwrsLicense-vx7-perm.lic粘贴到安装目…

WookTeam是一款轻量级的开源在线团队协作工具

产品介绍 English Documentation wookteam 是一款轻量级的在线团队协作工具,提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发,知识库管理等工具。wookteam 支持团队在线聊天沟通,订阅任务动态实时推送。wookteam 全部开源…

KVM网络桥接模式底层网络原理解说

文章目录 前言一、tap设备在kvm中的应用1. tap虚拟网络设备2. Tap/Tun工作原理3. 结论 二、KVM网络桥接模式细节解说1.查看虚拟网卡2.vnet虚拟网卡说明 总结 前言 在以下两篇文章中我们介绍了虚拟网卡技术以及虚拟交换机技术,今天我们再来详细说说在在kvm网络模式下…

1.4. 运算符与表达式

在 Java 中,运算符是用于执行特定操作的符号,而表达式是由变量、常量和运算符组成的一段代码,用于计算值。本节将介绍 Java 中的常用运算符和表达式的使用。 1.4.1. 算术运算符 Java 支持以下算术运算符: 加法(&…

【嵌入式烧录/刷写文件】-3.3-Bin文件转换为S19/Hex文件

案例背景(共8页精讲): 该篇将告诉您:如何使用Vector HexView工具,j将一个bin文件转换为Intel Hex或Motorola S-record(S19/SREC/mot/SX)文件。 目录 1 Intel Hex,Motorola S-record(S19/SREC/mot/SX),Bin文件之间的…

pytorch基础学习-tensorboardX

最近训练总是出问题,听取建议,在pytorch环境下引入了tensorboard 1、安装tensorboardX tensorboardX是在tensorboard前提下进行安装的,所以我们需要先安装tensorboard pip install tensorboardpip install tensorboardX2、简单使用 这里我…

常用服务端口号-你知道的和不知道的都在这(全家桶)

网络服务: Xwindow:6000 RDP:3389 VNC:5900 telnet:23 ssh:22 FTP:21 SMTP:25 samba:UDP137,138,TCP,139,445 POP3:110 业务服务: apache:80 &am…