
设计模式—— 三:依赖倒置原则
高层模块不应直接依赖低层模块,两者都应依赖于抽象; 抽象不应直接依赖具体实现类; 具体实现类应依赖于抽象。这是软件设计的三大核心原则之一,广泛应用于模块化设计、合成设计以及复用设计等场景中。
发布日期:2021-05-14 17:35:20
浏览次数:9
分类:精选文章
本文共 2070 字,大约阅读时间需要 6 分钟。
什么是依赖倒置原则?
定义解析
依赖倒置原则(Dependency Inversion Principle, DIP)提出的核心思想是:高层模块不应直接依赖底层模块,而是通过抽象(接口或抽象类)间接建立依赖关系。具体定义如下:
依赖倒置原则的意义
一、降低耦合度:通过抽象层隔离具体实现,减少模块间的紧密联系,避免因模块改动而导致的广泛影响。
二、提升系统稳定性:系统各部分相对独立,便于扩展与维护。三、便于并发开发:高层模块与低层模块分离,减少沟通冲突。案例分析——从陆龆开叉到依赖注入
一个典型的Java场景:司机驾驶不同品牌车辆。
初始实现:直接耦合
- Benz.java:```javapublic class Benz {public void run() { System.out.println("奔驰开始..."); }``
- Driver.java:```javapublic class Driver {public void drive(Benz benz) { benz.run(); }``
- 问题:扩展性差,新增车型需要修改Driver.java。
引入依赖倒置原则:通过接口实现解耦
- 定义接口:
public interface ICar { void run(); }
- 司机接口:
public interface IDriver { void drive(ICar car); }
- 司机实现类:
public class Driver implements IDriver { public void drive(ICar car) { car.run(); }
- 车型实现类:
public class Benz implements ICar { public void run() { System.out.println("奔驰开始..."); }}public class BMW implements ICar { public void run() { System.out.println("宝马开始..."); }}
- 场景类:```javapublic class Client {public static void main(String[] args) {IDriver driver = new Driver();ICar benz = new Benz();driver.drive(benz);ICar bmw = new BMW();driver.drive(bmw);}}
#### 依赖注入的三种方式
在Java中,依赖注入是实现依赖倒置的核心技术,主要方法有:** constructor injection(构造函数注入)**:通过无参数构造函数接收依赖对象。
- 适用于对依赖注入较为简单的场景。
** setter injection(Setter注入)**:通过Setter方法注入依赖对象。
- 适用于对依赖类型较为确定的场景。
** interface injection(接口注入)**:在接口中定义依赖关系,实现类只需实现接口即可。
- 无需显式传递依赖对象,依赖关系从接口实现得到。
实现示例:接口注入的方式
// definitionspublic interface ICar { void run(); }public interface IDriver { void drive(ICar car); }// implementationspublic class Benz implements ICar { public void run() { System.out.println("奔驰开始..."); }}public class BMW implements ICar { public void run() { System.out.println("宝马开始..."); }}public class Driver implements IDriver { public void drive(ICar car) { car.run(); }}
优化后的思考维度
- 避免不变更原则:只有高层模块需要修改,低层模块保持不变。
- 易于扩展:新增车型只需实现对应接口,无需修改司机类。
- 降低风险:降低并发开发冲突的概率,提高开发效率。
结语
通过依赖倒置原则和依赖注入技术,可以显著提升系统设计的可维护性与扩展性。在实际开发中,这三种注入方式可以根据具体场景灵活选择,以实现最佳性与可读性。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月30日 07时22分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【ARM自学笔记】ARM Cortex -A中断系统(程序篇)
2019-03-11
解决微信小程序中 calc 失效问题
2019-03-11
JS数组去重的方法
2019-03-11
堆的应用_topK算法和堆排序
2019-03-11
双向链表
2019-03-11
并查集(求连通块数量)
2019-03-11
蓝桥训练 分考场
2019-03-11
最大半连通子图
2019-03-11
Remove Extra one 维护前缀最大最小值
2019-03-11
Linux命令 - pwd命令
2019-03-11
Mysql学习笔记
2019-03-11
最大的和
2019-03-11
跳台阶
2019-03-11
另类加法,走方格的方案数,最近公共祖先
2019-03-11
线程学习5
2019-03-11
[Java Path Finder][JPF学习笔记][7]JPF输出详细程度设置
2019-03-11
GitHub完整记录数据库GHTorrent的下载和安装经验
2019-03-11
SKLearn中SVM参数自动选择的最简单示例(使用GridSearchCV)
2019-03-11
设计模式—— 三:依赖倒置原则
2019-03-11
SpringBoot打包之后乱码
2019-03-11