0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

案例解析依赖注入和控制反转

西西 来源:博客园 作者: 大壮他哥 2020-10-30 15:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

什么是依赖注入

依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点。在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行。

什么是控制反转

在解释什么是控制反转的之前我们先引入上一篇博文一个博友在评论中提的问题:依赖注入和控制反转不是一回事吗?

在我看来,控制反转这种思想最终的实现要依赖与依赖注入这种实现方式。控制反转只是把高低层的关系发生变化,以前底层模块在实现功能的时候可能会依赖于高层模块,通过控制反转可以让底层模块依赖于一个接口,如果这个时候高层模块要使用底层模块的话就必须

实现这个接口,然后通过依赖注入的方式把高层模块的实现类注册到底层模块中使用。

有可能上面的解释大家比较懵,下面我会通过举例来进一步介绍控制反转这种设计模式。

一个例子理解控制反转

从上图可以看出驾驶者依赖“汽车“和“火车”这两个类,如果驾驶员需要开汽车话的就需要实例化一个汽车类,需要开火车的话则需要实例化一个火车类

//开汽车

汽车 cat=new 汽车();

cat.Stop();

//开火车省略。。

这个时候如果说我们需要开飞机怎么办?传统做法则是新建一个飞机类,然后在驾驶者直接实例化飞机类即可。

控制反转

我们暂把上图的框架成为“自动驾驶系统”,现在“自动驾驶系统”已经拥有了自动开汽车、开飞机、开火车的功能了,你觉得已经很强大了,于是把这套系统卖给了某个公司,但是这家公司的业务不仅限于前三种交通工具,现在这家公司要实现驾驶者可以驾驶飞船,如下图所示

大家可以看到如果我们的“自动驾驶系统”要实现可以驾驶飞船的话,就需要驾驶者创建“飞船”的对象,这个时候我们的框架还是依赖于外部(因为飞船类在客户那边)。这个就是我们常说的底层模块依赖于高级模块。这种依赖肯定是不行的,随着客户的变化就要改动我们的框架,这种做法肯定不行,我们继续演变。

现在我们的驾驶者并不直接依赖于某个具体实现类,而且依赖于接口,但是这个时候上图就暴露了一个问题,希望大家先不要看下面的文字,大家可以先思考下上图有什么问题。(上图三个交通工具和接口的关系标识错了,应该是实现)

上图的设计虽然解决了不用New具体那个对象的问题,但是新的问题也随之而来:驾驶者到底使用哪个实现类?大家都知道接口是不能直接实例化的,能够实例化的只有接口的具体的实现类。OK,为了解决这个问题我们继续演变

上图我们使用工厂模式,这时候的关系是驾驶者依赖与工厂类,由工厂类具体去创建具体的实现类。根据上图我们再看如果我们实现开飞船,那么它们之间的关系会发生什么样的变化(上图三个交通工具和接口的关系标识错了,应该是实现)

通过一系列演化,现在两者之间的关系已经彻底发生了改变,以前是底层模块(框架)依赖于高层模块,现在变成了高层模块依赖于底层模块,从上图可以看出,无论你是要开飞船还是开火箭,只要你实现了“交通工具”接口,那么我就可以在工厂类里面给创建出来。这样一来不仅增加了我们系统的可扩展性,也提高了我们系统的整体稳健型。

最后来总结一下到底什么是控制反转,我的答案已经在文章开头给出了,下面给出维基百科的答案:

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 面向对象
    +关注

    关注

    0

    文章

    64

    浏览量

    10279
  • 控制反转
    +关注

    关注

    0

    文章

    1

    浏览量

    981
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    注入变压器入门(二):6大应用场景

    注入变压器凭借其独特的电气特性,在多个领域发挥着重要作用,以下是其主要应用场景:1、电源环路稳定性分析注入变压器被广泛应用于开关电源和DC-DC转换器的环路稳定性分析中。通过向电源控制回路注入
    的头像 发表于 04-10 17:22 704次阅读
    <b class='flag-5'>注入</b>变压器入门(二):6大应用场景

    步进电机控制方案中驱动板的核心作用与技术解析

    步进电机作为开环运动控制的核心执行元件,其控制精度、运行稳定性、负载能力与噪声表现,完全依赖驱动板的性能支撑。驱动板是步进电机控制方案中的 “功率中枢与
    发表于 04-10 15:34 253次阅读

    注入变压器入门:从定义到关键技术参数解析

    一、定义与工作原理注入变压器(InjectionTransformer),也称注入器或信号注入器,本质上是一种特殊设计的、用于信号注入的隔离变压器,主要用于将网络分析仪、示波器、频响分
    的头像 发表于 03-27 17:22 565次阅读
    <b class='flag-5'>注入</b>变压器入门:从定义到关键技术参数<b class='flag-5'>解析</b>

    DR1M90 开源 IgH EtherCAT 主站案例:伺服电机正反转实时控制方案

    本文为创龙科技DR1M90 评估板的 IgH EtherCAT 主站应用案例,基于 Linux-RT 内核与开源协议栈,实现伺服电机正反转实时控制。案例通讯周期 1ms,支持电机 0-10000(正
    的头像 发表于 01-04 15:40 3058次阅读
    DR1M90 开源 IgH EtherCAT 主站案例:伺服电机正<b class='flag-5'>反转</b>实时<b class='flag-5'>控制</b>方案

    经典 PLC 程序(2) - 正反转

    PLC控制电机正反转是工业控制中的典型应用,核心逻辑是通过接触器(或继电器继电器)控制电机的相序,同时需要加入互锁和自锁保护,防止接触器冲突或误动作。
    的头像 发表于 12-24 11:41 924次阅读
    经典 PLC 程序(2) - 正<b class='flag-5'>反转</b>

    分析嵌入式软件代码的漏洞-代码注入

    运行,因此成功的代码注入攻击可以完全控制机器以及窃取数据,导致设备发生故障,将其作为其僵尸网络成员或使其永久无法使用。 代码注入漏洞的关键方面是: 该程序从输入通道读取数据 该程序将数据视为代码并对其
    发表于 12-22 12:53

    C语言位域反转的应用

    位域反转(Bit Reversal) unsigned int reverse_bits(unsigned int num) { unsigned int numOfBits = sizeof
    发表于 12-12 06:42

    热载流子注入效应深度解析

    在半导体行业追求芯片性能与集成度的道路上,热载流子注入效应(HCI)如同隐形杀手,悄然侵蚀着芯片的可靠性与寿命。随着集成电路尺寸迈入纳米级,这一问题愈发凸显,成为制约芯片技术发展的关键瓶颈。
    的头像 发表于 12-03 16:41 1781次阅读
    热载流子<b class='flag-5'>注入</b>效应深度<b class='flag-5'>解析</b>

    求助,FT8161N无法控制反转

    FT8161N,3HALL ic+2Res FOC,无法通过引脚DIR控制电机正反转;切换上位机的TestDIR选项,电机依然只能一个方向转;
    发表于 11-18 10:17

    离子注入工艺中的常见问题及解决方案

    在集成电路制造的离子注入工艺中,完成离子注入与退火处理后,需对注入结果进行严格的质量检查,以确保掺杂效果符合器件设计要求。当前主流的质量检查方法主要有两种:四探针法与热波法,两种方法各有特点,适用于不同的检测场景。
    的头像 发表于 11-17 15:33 1559次阅读
    离子<b class='flag-5'>注入</b>工艺中的常见问题及解决方案

    离子注入技术的常见问题

    离子注入单晶靶材时,因靶体存在特定晶向,其对入射离子的阻滞作用不再如非晶材料般呈现各向同性。沿硅晶体部分晶向观察,能发现晶格间存在特定通道(图 1)。当离子入射方向与靶材主晶轴平行时,部分离子会直接
    的头像 发表于 09-12 17:16 2982次阅读
    离子<b class='flag-5'>注入</b>技术的常见问题

    基于低频旋转电压信号注入的PMSM初始定位

    针对增量式光电编码器在永磁同步电机工作中存在的初始定位问题,提出了使用低频旋转电乐信号注入法,通过检测注入信号作用下电机转子发生微小转动的时刻,确定转子初始位置的方法。通过详细分析永磁同步电机在低频
    发表于 08-06 14:36

    博士学位论文-永磁同步电机脉振高频信号注入无位置传感器技术研究

    同步电机无位置传感器控制技术的研究现状进行了综述,研究表明,实现电机低速时转子位置与转速估计的难度较大。因此,本文紧紧围绕表贴式永磁同步电机的零速和低速时无位置传感器控制,采用脉振高频信号注入法进行了深入
    发表于 07-17 14:34

    自动化生产线如何依赖驱动芯片?关键技术解析

    解析传送带、泵类设备对电机控制的高精度需求,揭示华芯邦芯片在工业自动化中的稳定表现。
    的头像 发表于 05-29 17:56 742次阅读

    注入增强型IGBT学习笔记

    为了协调IGBT通态特性与关断特性及短路特性之间的矛盾,提高器件的综合性能和可靠性,在IGBT中引入了一种电子注入增强效应(Injection Enhancement Effect,IE),既可
    的头像 发表于 05-21 14:15 2032次阅读
    <b class='flag-5'>注入</b>增强型IGBT学习笔记