首页 > 其他分享 >什么是依赖倒置原则

什么是依赖倒置原则

时间:2024-08-14 16:05:50浏览次数:13  
标签:依赖 原则 MessageService 抽象 NotificationService 倒置 public

依赖倒置原则(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的代码。这就体现了依赖倒置原则的精神。

标签:依赖,原则,MessageService,抽象,NotificationService,倒置,public
From: https://www.cnblogs.com/wgjava/p/18359195

相关文章

  • Vue3+Vite项目从零搭建+安装依赖+配置按需导入
    环境准备Vscode/HBuilder等任何一种前端开发工具node.js&npm本地开发环境源代码管理:Git技术栈项目构建创建项目npmcreatevite依次运行最后三行出现,成功启动项目在浏览器输入http://localhost:5173/可以显示页面src别名的配置在开发项目的时候文件与文件......
  • 爵士编曲:和弦排列 躯壳排列 四度排列 无根音排列 Drop 就近原则 So what排列
    和弦排列法是和弦在四部和声中的纵向排列方式称为“和弦排列法”。根据和弦排列时上方三声部各相邻声部之间的音程距离,原位三和弦可以有“密集排列”和“开放排列”以及“混合排列”三种排列法。①密集排列法:密集排列法(Closeposition)为上方三声部中相邻声部之间的距离在四度......
  • NPM依赖管理:精通版本范围锁定策略
    引言在JavaScript项目开发中,依赖包的精确控制对于维护项目稳定性至关重要。NPM(NodePackageManager)作为Node.js的包管理器,提供了一套灵活的版本控制机制,允许开发者通过版本范围锁定策略来管理依赖包的更新。本文将详细介绍如何使用NPM设置包的版本范围锁定策略,帮助开发者......
  • NPM依赖管理:掌握自动更新策略的艺术
    引言在现代JavaScript应用开发中,依赖包的自动更新是保持项目现代化和安全性的关键。NPM(NodePackageManager)作为Node.js生态系统的心脏,提供了一套强大的版本控制机制,允许开发者设置自动更新策略。本文将详细介绍如何使用NPM设置包的版本自动更新策略,帮助开发者自动化依赖......
  • 当 Spring 循环依赖碰上 Aysnc,调试过程中出现 BeanCurrentlyInCreationException,有点
    开心一刻前两天有个女生加我,我同意了第一天,她和我聊文学,聊理想,聊篮球,聊小猫小狗第二天,她和我说要看我腹肌吓我一跳,我反手就删除拉黑,我特喵一肚子的肥肉,哪来的腹肌!循环依赖关于Spring的循环依赖,我已经写了4篇Spring的循环依赖,源码详细分析→真的非要三级缓存吗再......
  • 2.2 C 语言常量的定义与变量命名的规范及原则
    目录1常量1.1常量的分类1.2符号常量(#define)1.2.1定义不同类型的符号常量1.2.2 注意事项1.3使用const 定义常量1.3.1定义不同类型的常量1.3.2常量的命名规范2变量2.1变量名的作用2.2变量的命名规范2.3变量的命名原则2.4大小驼峰命名法1常量 ......
  • 在python项目的docker镜像里使用pdm管理依赖
    前言在DjangoStarter项目中,我已经使用pdm作为默认的包管理器,不再直接使用pip所以部署的时候dockerfile和docker-compose配置也得修改一下。dockerfile首先修改一下dockerfileARGPYTHON_BASE=3.11FROMpython:$PYTHON_BASE#设置python环境变量ENVPYTHONUN......
  • 掌握NPM版本控制:项目维护与依赖管理的艺术
    在软件开发过程中,版本控制是确保项目稳定发展的关键。NPM(NodePackageManager)作为Node.js的包管理工具,不仅提供了包的安装和管理功能,还内置了一套版本控制机制,帮助开发者管理项目的不同版本。本文将详细介绍如何使用NPM进行项目的版本控制。版本控制的重要性在多人协作的......
  • 合成复用原则(CRP)
    目录一、概念1.合成2.复用二、合成复用原则的优点1.降低耦合度2.提高灵活性3.避免继承的复杂性三、示例合成复用原则(CompositeReusePrinciple,CRP)是面向对象设计中的一个重要指导原则,强调通过组合(而不是继承)来实现代码复用。它鼓励开发者利用对象的组合......
  • 通过示例了解 .NET Core 中的依赖注入
    依赖注入(DI)是一种用于实现IoC(控制反转)的设计模式,可以更好地解耦应用程序内的依赖关系并更轻松地管理它们。.NETCore内置了对依赖注入的支持,提供了一种有效管理依赖关系的强大方法。一.什么是依赖注入?依赖注入是一种技术,其中一个对象提供另一个对象的依赖项。“依赖......