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

小谈设计模式(6)—依赖倒转原则

小谈设计模式(6)—依赖倒转原则

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 依赖倒转原则
    • 核心思想
      • 关键点分析
        • a
        • b
        • c
    • 优缺点分析
      • 优点
        • 降低模块间的耦合度
        • 提高代码的可扩展性
        • 便于进行单元测试
      • 缺点
        • 增加代码的复杂性
        • 需要额外的设计和开发工作
    • Java代码实现
      • 示例分析
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

依赖倒转原则

依赖倒转原则(Dependency Inversion Principle,DIP)是面向对象设计中的一个重要原则,它指导着如何构建松耦合、可扩展和可维护的软件系统。该原则由罗伯特·C·马丁(Robert C. Martin)提出。

核心思想

通过抽象来解耦高层模块和低层模块之间的依赖关系。
在这里插入图片描述

关键点分析

a

高层模块不应该依赖于低层模块的具体实现,而是依赖于抽象接口。这意味着高层模块应该定义一个抽象接口,而低层模块实现该接口。通过依赖于抽象接口,高层模块可以独立于具体实现进行编程。

b

抽象接口应该由高层模块定义,而不是由低层模块定义。这样可以确保高层模块对于依赖的控制,而不会受到低层模块的限制。高层模块可以根据自己的需求定义接口的方法和属性,而不需要依赖于低层模块的具体实现细节。

c

依赖注入是实现依赖倒转原则的重要手段。通过依赖注入,高层模块可以将具体实现类的对象传递给抽象接口。依赖注入可以通过构造函数、方法参数或者属性注入的方式实现。这样可以实现解耦,高层模块不需要关心具体实现类的创建和管理。
在这里插入图片描述

优缺点分析

优点

降低模块间的耦合度

通过依赖倒转原则,高层模块不依赖于低层模块的具体实现,而是依赖于抽象接口。这样可以使得模块之间的耦合度降低,提高代码的灵活性和可维护性。

提高代码的可扩展性

由于高层模块不依赖于低层模块的具体实现,当需要新增或修改低层模块时,只需要修改具体实现类而不需要修改高层模块的代码。这样可以提高代码的可扩展性,减少对现有代码的影响。

便于进行单元测试

由于高层模块依赖于抽象接口,可以通过使用模拟对象来进行单元测试,而不需要依赖于具体实现类。这样可以更容易地进行测试,提高代码的质量。

在这里插入图片描述

缺点

增加代码的复杂性

依赖倒转原则需要引入抽象接口和依赖注入等机制,这会增加代码的复杂性和理解难度。特别是在项目规模较小或简单场景下,引入这些机制可能会显得过于繁琐。

需要额外的设计和开发工作

在应用依赖倒转原则时,需要进行额外的设计和开发工作,包括定义抽象接口、实现具体实现类、进行依赖注入等。这会增加开发成本和工作量。

综上所述,依赖倒转原则在一定程度上可以提高代码的灵活性、可维护性和可扩展性,但也需要权衡其引入的复杂性和开发成本。在设计和开发过程中,需要根据具体的场景和需求来决定是否采用依赖倒转原则。

Java代码实现

// 定义抽象接口
public interface MessageSender {void sendMessage(String message);
}// 具体实现类1
public class EmailSender implements MessageSender {@Overridepublic void sendMessage(String message) {System.out.println("Sending email: " + message);}
}// 具体实现类2
public class SmsSender implements MessageSender {@Overridepublic void sendMessage(String message) {System.out.println("Sending SMS: " + message);}
}// 高层模块,依赖于抽象接口
public class NotificationService {private MessageSender messageSender;// 通过构造函数进行依赖注入public NotificationService(MessageSender messageSender) {this.messageSender = messageSender;}public void sendNotification(String message) {// 调用抽象接口的方法messageSender.sendMessage(message);}
}// 测试代码
public class Main {public static void main(String[] args) {// 创建具体实现类的对象MessageSender emailSender = new EmailSender();MessageSender smsSender = new SmsSender();// 创建高层模块的对象,并传入具体实现类的对象NotificationService emailNotificationService = new NotificationService(emailSender);NotificationService smsNotificationService = new NotificationService(smsSender);// 调用高层模块的方法emailNotificationService.sendNotification("Hello, this is an email notification.");smsNotificationService.sendNotification("Hello, this is an SMS notification.");}
}

在这里插入图片描述

示例分析

在抽象接口MessageSender定义了发送消息的方法。具体实现类EmailSender和SmsSender分别实现了该接口,并提供了发送邮件和发送短信的具体实现。高层模块NotificationService依赖于抽象接口MessageSender,通过构造函数进行依赖注入,从而实现了依赖倒转原则。

总结

依赖倒置原则强调了面向抽象编程的重要性,通过抽象接口和依赖注入等技术,可以降低模块之间的耦合度,提高代码的灵活性和可维护性。

http://www.lryc.cn/news/179081.html

相关文章:

  • JetBrains常用插件
  • 【C++哈希应用】位图、布隆过滤器
  • Qt 编译纯c的C99的项目, error: undefined reference to `f()‘
  • TensorFlow入门(五、指定GPU运算)
  • Unity - 实践: Metallic流程贴图 转 Specular流程贴图
  • 第三章:最新版零基础学习 PYTHON 教程(第四节 - Python 运算符—Python 逻辑运算符及示例)
  • 如何做好测试?(三)功能测试 (Functional Testing, FT)
  • Ubuntu-Server-22.04安装桌面+VNC
  • 职业规划,什么是职业兴趣 - 我喜欢做什么?
  • 基于Java的高校学生党员发展流程管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 【NLP的python库(03/4) 】: 全面概述
  • 面试理论篇三
  • ShardingSphere|shardingJDBC - 在使用数据分片功能情况下无法配置读写分离
  • char s1[len + 1]; 报错说需要常量?
  • 【Linux】CentOS-6.8超详细安装教程
  • 【Java 进阶篇】MySQL启动与关闭、目录结构以及 SQL 相关概念
  • Android 11.0 mt6771新增分区功能实现一
  • LiveData简单使用
  • 手动实现Transformer
  • leetcode456 132 Pattern
  • WordPress外贸建站Astra免费版教程指南(2023)
  • Vue之ElementUI实现登陆及注册
  • 网络代理的多面应用:保障隐私、增强安全和数据获取
  • 字节一面:深拷贝浅拷贝的区别?如何实现一个深拷贝?
  • 协议-TCP协议-基础概念02-TCP握手被拒绝-内核参数-指数退避原则-TCP窗口-TCP重传
  • PDF文件压缩软件 PDF Squeezer mac中文版​软件特点
  • VS+Qt+opencascade三维绘图stp/step/igs/stl格式图形读取显示
  • 如何在Ubuntu中切换root用户和普通用户
  • 从零开始之了解电机及其控制(10)空间矢量理论
  • PSINS工具箱学习(一)下载安装初始化、SINS-GPS组合导航仿真、习惯约定与常用变量符号、数据导入转换、绘图显示