设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?

抽象不要依赖具体实现细节,具体实现细节依赖抽象
高层模块和低层模块应该通过抽象互相依赖
高层模块不要依赖低层模块
将MessageSender定义成接口
依赖注入的实现方式
非依赖注入实现方式
通过构造函数、函数参数等方式传递(或注入)给类使用
不通过new()方式在类内部创建依赖类对象
模板设计模式
框架驱动整个程序流程的执行
框架提供可扩展的代码骨架
区别和联系
依赖反转原则
依赖注入框架
依赖注入
控制反转
定义
依赖注入框架的例子
简单配置需要创建的类对象、类与类之间的依赖关系
框架提供的扩展点
优化
例子
概念
实现方法
例子
课堂讨论
重点回顾
依赖反转原则(DIP)
依赖注入框架(DI Framework)
依赖注入(DI)
控制反转(IOC)
控制反转、依赖反转、依赖注入

该思维导图由 AI 生成,仅供参考

关于 SOLID 原则,我们已经学过单一职责、开闭、里式替换、接口隔离这四个原则。今天,我们再来学习最后一个原则:依赖反转原则。在前面几节课中,我们讲到,单一职责原则和开闭原则的原理比较简单,但是,想要在实践中用好却比较难。而今天我们要讲到的依赖反转原则正好相反。这个原则用起来比较简单,但概念理解起来比较难。比如,下面这几个问题,你看看能否清晰地回答出来:
“依赖反转”这个概念指的是“谁跟谁”的“什么依赖”被反转了?“反转”两个字该如何理解?
我们还经常听到另外两个概念:“控制反转”和“依赖注入”。这两个概念跟“依赖反转”有什么区别和联系呢?它们说的是同一个事情吗?
如果你熟悉 Java 语言,那 Spring 框架中的 IOC 跟这些概念又有什么关系呢?
看了刚刚这些问题,你是不是有点懵?别担心,今天我会带你将这些问题彻底搞个清楚。之后再有人问你,你就能轻松应对。话不多说,现在就让我们带着这些问题,正式开始今天的学习吧!

控制反转(IOC)

在讲“依赖反转原则”之前,我们先讲一讲“控制反转”。控制反转的英文翻译是 Inversion Of Control,缩写为 IOC。此处我要强调一下,如果你是 Java 工程师的话,暂时别把这个“IOC”跟 Spring 框架的 IOC 联系在一起。关于 Spring 的 IOC,我们待会儿还会讲到。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

控制反转(IOC)和依赖注入(DI)是软件开发中重要的概念。控制反转指的是将程序执行流程的控制权从程序员转移到框架,而依赖注入则是一种具体的编码技巧,通过构造函数、函数参数等方式将依赖的类对象传递给类使用,提高了代码的扩展性和灵活性。本文通过例子详细解释了控制反转和依赖注入的概念和实现方式,帮助读者理解这两个概念的区别和联系。同时,还提到了Spring框架中的IOC和依赖注入的关系,为读者提供了更多实际应用的参考。通过本文的学习,读者可以更好地理解和应用控制反转和依赖注入,为编写可测试性代码提供有效的手段。文章还介绍了依赖注入框架和依赖反转原则,为读者提供了更全面的知识体系。整体而言,本文内容丰富,涵盖了控制反转、依赖注入、依赖注入框架和依赖反转原则,对于想深入了解软件开发中的这些重要概念的读者来说,是一篇值得阅读的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(222)

  • 最新
  • 精选
  • thomas
    DIP原则有点嘎然而止的感觉,缺少了一个具体的例子。

    作者回复: tomcat的例子不算啊

    2019-12-16
    3
    27
  • JRich
    控制反转定义里是程序执行流程的控制权反转,而依赖注入讲的是对象的创建由外部创建好通过构造方法或setter方法注入进来,感觉两个讲的不是一个意思,虽然依赖注入也有控制反转的意思,但是对象的创建和获取的权利被反转,更确切的理解应该是2个场景吧。

    作者回复: ������

    2020-11-22
    1
  • 港岛妹夫
    想知道争哥的英文原文都是从哪里读来的. 如果是书的话, 可以推荐一些嘛~

    作者回复: 都是实践中来的,自己动脑子思考的比较多,书的话也就是看看而已,你可以看我写的这篇文章: https://mp.weixin.qq.com/s/uKkQMIWTtAmvsEYZCxvZeg

    2020-06-13
    1
  • |・ω・`)
    关于最后一个依赖反转能再举个简单的代码例子吗?Tomcat的案例没懂˙Ⱉ˙ฅ

    作者回复: 你网上搜下 开关的例子 那个更简单

    2019-12-18
    1
  • 堵车
    老师,今天怎么没更新,我已经迫不及待了。隔壁那本DDD好多词汇难理解,我受了打击,过来找安慰。

    作者回复: 周一三五更新的

    2019-12-17
    1
  • 沉淀的梦想
    SOLID 的最后一个原则D,我看好多书上说是 迪米特法则 啊,为什么文章里没有提呢?

    作者回复: d是dip 不是lod的 lod后面有讲到

    2019-12-16
    1
  • JRich
    基于接口而非实现编程使用了依赖注入编程技巧。因为基于接口而非实现编程使用了面向对象的多态特性来提高代码扩展性,必然不可能在类内部创建对象,只能从外部注入。区别就是依赖注入不仅可以使用接口,还可以使用类。

    作者回复: ������

    2020-11-20
  • 开心小毛
    底层模块依赖上层模块的抽象是否提倡?

    作者回复: 上层模块的抽象你是指什么呢?

    2020-01-05
    3
  • 程晓擘
    高层模块不依赖低层模块,它们共同依赖同一个抽象。抽象不要依赖具体实现细节,具体实现细节依赖抽象。 不太明白,为什么叫依赖倒置呀?倒置啥呢? 我可能会取名,依赖抽象原则,哈哈。

    作者回复: 倒置就是反转,我在文章中不是解释了为啥叫反转吗😂

    2020-01-05
  • 青子
    JunitApplication.register(new UserServiceTest(); 在控制反转中执行这句话会执行该类中的final修饰的main方法吗

    作者回复: 代码稍微有点问题,我改下,抱歉!

    2020-01-04
    3
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部