首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

什么是依赖倒置原则

编程知识
2024年08月14日 15:07

依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象设计原则之一,它是SOLID原则中的"D"。依赖倒置原则的核心思想是高层策略性业务规则不应该依赖于低层的具体实现细节,而两者都应该依赖于抽象。

依赖倒置原则主要包含两个基本点:

  1. 抽象不应该依赖于细节:系统中的抽象层(高层模块)不应当依赖于具体实现(低层模块),而是两者都应该依赖于抽象(如接口或抽象类)。

  2. 细节应该依赖于抽象:具体的实现应该依赖于抽象,这样在不修改抽象层代码的情况下,可以替换或修改具体的实现。

依赖倒置原则的优点包括:

  • 降低耦合度:由于模块间的依赖是基于抽象的,因此减少了模块间的直接依赖,降低了耦合度。
  • 提高模块化:系统更容易被分解为可复用的模块,因为模块间的交互是通过抽象接口进行的。
  • 增强灵活性:更换或升级系统的某个部分变得更加容易,因为具体实现可以独立于高层策略进行变化。

在实际应用中,依赖倒置原则可以通过以下方式实现:

  • 使用接口或抽象类定义系统组件之间的契约。
  • 通过依赖注入(Dependency Injection, DI)将具体实现注入到需要它们的对象中,而不是让对象自己创建或查找这些实现。
  • 避免在高层模块中直接使用具体类,而是通过抽象来引用。

依赖倒置原则是实现开闭原则(Open/Closed Principle)的基础,即软件实体应该对扩展开放,对修改关闭。通过依赖倒置,我们可以更容易地扩展系统功能,而不需要修改现有的代码。

下面来看一个简单的Java代码示例,让我们更好的理解依赖倒置原则的应用:

首先,我们定义一个抽象接口,表示一个可以发送消息的系统:

public interface MessageService {
    void sendMessage(String message);
}

然后,我们创建一个具体的发送服务实现这个接口:

public class EmailService implements MessageService {
    @Override
    public void sendMessage(String message) {
        System.out.println("Sending email: " + message);
    }
}

接下来,我们有一个高层策略类,它使用MessageService接口而不是具体的EmailService类:

public class NotificationService {
    private MessageService messageService;

    // 构造函数注入依赖
    public NotificationService(MessageService messageService) {
        this.messageService = messageService;
    }

    public void notifyUser(String message) {
        // 依赖于抽象,而不是具体实现
        messageService.sendMessage(message);
    }
}

最后,我们可以在客户端代码中使用这个系统:

public class Client {
    public static void main(String[] args) {
        // 创建具体的消息服务
        MessageService emailService = new EmailService();
        
        // 将具体的消息服务注入到高层策略中
        NotificationService notificationService = new NotificationService(emailService);
        
        // 使用高层策略发送消息
        notificationService.notifyUser("Hello, this is a test email.");
    }
}

在这个例子中,NotificationService类是一个高层策略类,它依赖于MessageService接口的抽象。我们通过构造函数注入具体的消息服务EmailService。这样,如果将来我们需要更换消息服务的实现(比如使用SmsService),我们只需要创建一个新的实现类并注入到NotificationService中,而不需要修改NotificationService的代码。这就体现了依赖倒置原则的精神。

From:https://www.cnblogs.com/wgjava/p/18359195
本文地址: http://shuzixingkong.net/article/1098
0评论
提交 加载更多评论
其他文章 kubernetes负载感知调度
背景 kubernetes 的原生调度器只能通过资源请求来调度 pod,这很容易造成一系列负载不均的问题, 并且很多情况下业务方都是超额申请资源,因此在原生调度器时代我们针对业务的特性以及评估等级来设置 Requests/Limit 比例来提升资源利用效率。 在这种场景下依然存在很多问题: 节点负载
kubernetes负载感知调度 kubernetes负载感知调度
线上问题排查——磁盘满
现象 群里反馈管理后台登录不上了,我一访问,整个界面空白,没有提示,打开 F12,发现控制台提示 js、css 等静态资源报 net::ERR_HTTP2_PROTOCOL_ERROR,客户端可以下载到服务端资源,第一次碰到这个,StackOverflow 走起 net::ERR_HTTP2_PRO
线上问题排查——磁盘满 线上问题排查——磁盘满 线上问题排查——磁盘满
简历模版免费使用 简历模版
分享一个简历制作平台。 免费的word模版/简历模版 链接地址 https://www.xyjianli.com https://www.xyjianli.com/list https://www.xyjianli.com/wordResume 简历的重要性:开启职业生涯的钥匙 在当今竞争
开关资源新方法:Try- with-resources
JDK7新特性:Try- with-resources try-with-resources 是 JDK 7中引入的一种新的异常处理机制,它主要用于自动管理资源,能够很容易地关闭在 try-catch 语句块中使用的资源。确保资源在不再需要时能够被正确关闭。这种机制简化了资源管理,使得资源的释放更加
开关资源新方法:Try- with-resources 开关资源新方法:Try- with-resources 开关资源新方法:Try- with-resources
使用Django-Channels实现websocket通信+大模型对话
前言 最近一直在做这个大模型项目,我选了 Django 作为框架(现在很多大模型应用都用的 FastAPI,不过我已经用习惯 Django 了) 之前使用 AspNetCore 作为后端的时候,我先后尝试了 Blazor Server,WebAPI SSE(Server Sent Event)等方案
使用Django-Channels实现websocket通信+大模型对话 使用Django-Channels实现websocket通信+大模型对话
JVM 参数配置
JVM 参数设置入门案例 JVM 的内存参数众多,但是在实际应用中主要关注堆内存的大小设置及堆内存中新生代和老年代的大小设置,下面看一个简单的 JVM 启动参数设置案例: java -server -Xms3g -Xmx3g -XX:NewSize=1g -XX:MetaspaceSize=128m
TCP三次握手和四次挥手
TCP三次握手和四次挥手详解 在网络通信中,TCP(传输控制协议)是一个非常重要的协议,用于确保数据在不可靠的网络环境中能够可靠传输。TCP通过三次握手(Three-way Handshake)建立连接,通过四次挥手(Four-way Termination)终止连接。 一、TCP三次握手 TCP的
Java 大文件IO操作效率对比【我说说 你瞅瞅】
Java 文件IO操作效率对比 通过以下几种方式读取数据文件,并连续进行 10 次测试: 1. FileInputStream + byte[] 文件字节输入流 + 字节数组读取方式 2. FileInputStream + Scanner 文件字节输入流 + Scanner 读取方式 3. Fi