当前位置: 首页 > news >正文

什么是依赖倒置原则

1、什么是依赖倒置原则

依赖倒置原则(Dependency Inversion Principle,DIP)是指高层模块不应该依赖于低层模块,它们都应该依赖于抽象。换句话说,具体类之间的依赖关系应该尽可能减少,而抽象类或接口之间的依赖关系应该尽可能增加。

这个原则的核心思想是将依赖关系从具体的实现类转移到抽象类或接口上。通过这种方式,高层模块和低层模块都可以依赖于抽象,而不是依赖于具体的实现类。这样做有几个好处:

  1. 降低耦合性:具体类之间的依赖关系减少,可以降低代码之间的耦合性,使得代码更加灵活和可维护。
  2. 可扩展性:通过将具体的实现类与使用类的耦合度降低到最小,我们可以方便地更换不同的实现类,而不需要修改使用类的代码。
  3. 灵活性:通过将具体的实现类注入到使用类中,我们可以灵活地选择不同的实现方案。例如,在不同的场景下使用不同的数据库连接或者数据访问方式。

简单来说,依赖倒置原则就是让我们不要直接依赖于具体的类,而是依赖于抽象的接口或抽象类。这样可以让我们的代码更加灵活、可维护和可扩展。

2、我们跟着一个例子更好的理解一下

假设我们有一个应用程序,它有一个“用户界面”组件和一个“数据存储”组件。用户界面组件负责处理用户输入和展示数据,而数据存储组件则负责数据的存储和检索。

// 定义一个抽象的接口  
public interface DataAccess {  void saveData(String data);  String readData();  
}  // 实现抽象接口的具体类  
public class MySQLDataAccess implements DataAccess {  @Override  public void saveData(String data) {  // 具体实现细节  }  @Override  public String readData() {  // 具体实现细节  return null;  }  
}  public class MongoDBDataAccess implements DataAccess {  @Override  public void saveData(String data) {  // 具体实现细节  }  @Override  public String readData() {  // 具体实现细节  return null;  }  
}  // 定义一个类,依赖于抽象接口  
public class UserInterface {  private DataAccess dataAccess;  // 通过构造函数注入依赖项  public UserInterface(DataAccess dataAccess) {  this.dataAccess = dataAccess;  }  public void saveData(String data) {  dataAccess.saveData(data);  }  public String readData() {  return dataAccess.readData();  }  
}

在这个例子中,我们定义了一个抽象的DataAccess接口,然后有两个具体类MySQLDataAccessMongoDBDataAccess实现了这个接口。接着,我们定义了一个UserInterface类,它依赖于抽象的DataAccess接口,而不是具体的实现类。最后,我们在构造函数中注入了依赖项,这样就可以让UserInterface类依赖于抽象的接口,而不是具体的实现类。

3、怎么将一个具体的DataAccess实现类(例如MySQLDataAccess)注入到UserInterface类中

在上面的代码例子中,我们将一个具体的DataAccess实现类(即MySQLDataAccess)注入到UserInterface类中的方式是通过构造函数注入。我们为UserInterface类的构造函数添加一个DataAccess类型的参数,并在构造方法中接收这个参数。

下面是将MySQLDataAccess注入到UserInterface类中的代码示例:

java复制代码// 创建MySQLDataAccess实例  MySQLDataAccess mysqlDataAccess = new MySQLDataAccess();  // 创建UserInterface实例,并将MySQLDataAccess实例注入到构造函数中  UserInterface userInterface = new UserInterface(mysqlDataAccess);

在这个例子中,我们首先创建了一个MySQLDataAccess实例,并将其作为参数传递给UserInterface类的构造方法。这样,当UserInterface类的实例被创建时,就会接收一个已经实例化的MySQLDataAccess对象,从而实现了依赖注入。

需要注意的是,在实际的应用程序中,我们通常会使用依赖注入框架(如Spring)来管理组件之间的依赖关系。这样可以避免手动创建和注入依赖项,提高代码的可维护性和可扩展性。

4、结论

在没有采用依赖倒置原则的情况下,用户界面组件可能会直接依赖于数据存储组件。这意味着用户界面组件需要知道数据存储组件的具体实现细节,例如数据库的URL、用户名和密码等。这会导致用户界面组件和数据存储组件紧密耦合,不利于代码的可维护性和可复用性。

采用依赖倒置原则后,我们可以创建一个抽象的“数据访问接口”,然后让数据存储组件实现这个接口。同时,用户界面组件只需要依赖于这个抽象的数据访问接口,而不需要知道具体的实现细节。这样,即使我们更换了数据存储组件(例如从MySQL数据库更换为MongoDB数据库),用户界面组件也不需要进行任何修改,因为它们只依赖于抽象的数据访问接口。

这个例子中,依赖倒置原则的实践主要体现在以下几点:

  1. 定义抽象的数据访问接口,而不是针对具体的数据存储组件。
  2. 让数据存储组件实现这个接口,而不是让用户界面组件依赖于具体的数据存储组件。
  3. 使用外部容器(例如Spring)来管理组件之间的依赖关系,而不是让组件自己去创建和管理其他组件。

通过这种方式,我们可以降低代码之间的耦合,提高代码的可维护性、可读性和可复用性。

相关文章:

什么是依赖倒置原则

1、什么是依赖倒置原则 依赖倒置原则(Dependency Inversion Principle,DIP)是指高层模块不应该依赖于低层模块,它们都应该依赖于抽象。换句话说,具体类之间的依赖关系应该尽可能减少,而抽象类或接口之间的…...

异常数据检测 | Python实现oneclassSVM模型异常数据检测

支持向量机(SVM)的异常检测 SVM通常应用于监督式学习,但OneClassSVM[8]算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 OneClassSVM OneClassSVM的思想来源于这篇论文[9],SVM使用…...

using meta-SQL 使用元SQL (3)

%FirstRows Syntax %FirstRows(n) Description The %FirstRows meta-SQL variable is replaced by database-specific SQL syntax to optimize retrieval of n rows. Depending on the database, this variable optimizes: FirstRows meta-SQL变量被特定于数据库的SQL语法…...

Spinnaker 基于 docker registry 触发部署

docker registry 触发部署 Spinnaker可以通过Docker镜像的变化来触发部署,这种方法允许你在Docker镜像发生变化时自动启动新的部署流程。 示例原理如下图所示: 以下是如何在Spinnaker中实现基于Docker Registry触发部署的配置流程。最终实现的效果如下…...

2023亚马逊云科技re:Invent,在开发者板块探究如何利用技术重塑业务

美国当地时间11月27日,一年一度的亚马逊云科技re:Invent大会在美国拉斯维加斯盛大开幕。这场全球云计算领域的前沿盛会,已连续12年成为引领行业的风向标。那么本次2023亚马逊云科技re:Invent大会又有哪些可玩、可看的新项目,下面就一起来瞧一…...

JAVA 使用stream流将List中的对象某一属性创建新的List

JAVA 使用stream流将List中的对象某一属性创建新的List 1.stream流介绍 Java Stream是Java 8引入的一种新机制,它可以让我们以声明式方式操作集合数据,提供了更加简洁、优雅的集合处理方式。Stream是一个来自数据源的元素队列,并支持聚合操…...

Elasticsearch:ES|QL 函数及操作符

如果你对 ES|QL 还不是很熟悉的话,请阅读之前的文章 “Elasticsearch:ES|QL 查询语言简介​​​​​​​”。ES|QL 提供了一整套用于处理数据的函数和运算符。 功能分为以下几类: 目录 ES|QL 聚合函数 AVG COUNT COUNT_DISTINCT 计数为近…...

SpringBoot——Swagger2 接口规范

优质博文:IT-BLOG-CN 如今,REST和微服务已经有了很大的发展势头。但是,REST规范中并没有提供一种规范来编写我们的对外REST接口API文档。每个人都在用自己的方式记录api文档,因此没有一种标准规范能够让我们很容易的理解和使用该…...

网络入门---网络编程预备知识

目录标题 ifconfigip地址和mac地址的区别端口号pid和端口号UDP和TCP的初步了解网络字节序socket套接字 ifconfig 通过指令ifconfig便可以查看到两个网络接口: 我们当前使用的是一个linux服务器并是一个终端设备,所以他只需要一个接口用来入网即可&…...

记录一次YAMLException异常

记录一次YAMLException异常 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 报错以及B…...

calendar --- 日历相关函数

calendar --- 日历相关函数 源代码: Lib/calendar.py 这个模块让你可以输出像 Unix cal 那样的日历,它还提供了其它与日历相关的实用函数。 默认情况下,这些日历把星期一作为一周的第一天,星期天作为一周的最后一天(这…...

中国信息通信研究院产业与规划研究所校招一面、二面内容

本文介绍2024届秋招中,中国信息通信研究院的数字孪生智慧城市研究员岗位一面、二面的面试基本情况、提问问题等。 10月投递了中国信息通信研究院的数字孪生智慧城市研究员岗位,所在部门为数字孪生与城市数字化研究部。目前完成了一面与二面,在…...

一些数据库学习的小结

一些数据库学习的小结: SQL: 遵循ACID原则。支持Transaction。适合在线交易处理(OLTP),不适合在线分析处理(OLAP)。例子有 MySQL 读写效率 单机约1KQPS POSTGRESQL NoSQL: 遵循BASE原则。不支持Transaction。例子有 DynamoDB - Amazon Key-Value BigTa…...

【计算机网络】虚拟路由冗余(VRRP)协议原理与配置

目录 1、VRRP虚拟路由器冗余协议 1.1、协议作用 1.2、名词解释 1.3、简介 1.4、工作原理 1.5、应用实例 2、 VRRP配置 2.1、配置命令 1、VRRP虚拟路由器冗余协议 1.1、协议作用 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF…...

Using Set Processing Examples 使用集合处理示例

Using Set Processing Examples 使用集合处理示例 Each of the following topics contains an example of set processing. 以下每个主题都包含一个集处理示例。 Payroll 工资单 In this example, suppose the payroll department needs to give a 1000 USD salary increase to…...

Spark将execl表格文件导入到mysql中

实现代码 excel所需的pom依赖 案例实现 实现代码 package excel_mysqlimport org.apache.spark.sql.SparkSession import java.util.Propertiesobject t1 {def main(args: Array[String]): Unit {val spark SparkSession.builder().appName("ExcelToMySQL") /…...

Vue3-Eslint配置代码风格

prettier风格配置 官网:https://prettier.io Eslint:代码纠错,关注于规范 prettier:专注于代码格式化的插件,让代码更加美观 两者各有所长,配合使用优化代码 生效前提: 1)禁用…...

“Install Js dependencies failed“JS SDK安装失败【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决措施1解决方案2:其他解决方案解决方案3:此Bug解决方案总结项目场景: 在下载JS SDK时,出现下载失败的情况,并显示“Install Js dependencies failed”。 在使用版本为DevEco Studio 3.0.0.601 Beta1进行低代码开发时…...

接口测试入门8问(含答案+文档)

Q1:什么是接口测试,基础知识什么的讲讲吧! A:你好,接口可以分下面几种 1、系统与系统之间的调用,比如银行会提供接口供电子商务网站调用,或者说,支付宝会提供接口给淘宝调用 2、上…...

【Spring之事务底层源码解析,持续更新中~~~】

文章目录 一、EnableTransactionManagement工作原理二、Spring事务基本执行原理三、Spring事务传播机制与分类四、Spring事务强制回滚五、TransactionSynchronization六、Spring事务详细执行流程 一、EnableTransactionManagement工作原理 二、Spring事务基本执行原理 三、Sp…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...