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

    浏览量

    10217
  • 控制反转
    +关注

    关注

    0

    文章

    1

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    求助,FT8161N无法控制反转

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

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

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

    基于51/32单片机按键控制步进电机正反转,A4988驱动

    基于51/32单片机按键控制步进电机正反转,A4988驱动
    发表于 04-14 15:05 6次下载

    ATV310A变频器如何低电平触发反转

    这一操作变得更加灵活和方便。 本文详细介绍了ATV310A变频器如何设置低电平触发反转的方法,包括反转控制的基本原理、设置步骤、注意事项与故障排除以及实际应用案例。让读者可以深入了解ATV310A变频器的
    的头像 发表于 04-14 07:38 1177次阅读

    如何控制三菱FR D720S 正反转

    PU方式可以控制电机的正反转么?
    发表于 04-06 20:28

    可控硅的控制奥秘:依赖直流还是交流?

    可控硅的控制奥秘:依赖直流还是交流?可控硅,也称为硅控整流器(SiliconControlledRectifier,简称SCR),是一种重要的半导体器件,广泛应用于电力电子、电机控制、照明调节等领域
    的头像 发表于 04-03 11:59 1467次阅读
    可控硅的<b class='flag-5'>控制</b>奥秘:<b class='flag-5'>依赖</b>直流还是交流?

    BLDC基于脉冲注入法的无刷直流电机转子位置

    本文提出了一种采用脉冲注入来检测无刷直流电机在静止状态时转子位置的方法。基 于方法依次向定子绕组注入一系列的脉冲,通过脉冲电流的变化对转子位置进行估算。实验 结果表明:该方法不但具有较高的位置检测准确性,同时对电机的参数依赖性低
    发表于 03-14 16:24

    有刷电机如何实现正反转(可下载)

    一、有刷电机结构介绍无刷直流永磁电动机广泛地用于驱动和伺服系统中,在许多场合,不但要求电动机具 有良好地启动和调节特性,而且要求电机能够正反转。本篇文章,我们着重来分析下有刷 永磁直流电动机地正反转
    发表于 03-03 14:32 2次下载

    控制DLP2010镜面反转,微镜四周有白边,请问这个现象是正常的吗?

    DLP2010分辨率为854*480,按照这个分辨率控制镜面反转,总是出现四周有白边,也就四周一圈的微镜不反转。请问这个现象是正常的吗?如果我想让所有的微晶都反转,该如何做?谢谢
    发表于 02-19 06:27

    离子注入工艺中的重要参数和监控手段

    本文简单介绍了离子注入工艺中的重要参数和离子注入工艺的监控手段。 在硅晶圆制造过程中,离子的分布状况对器件性能起着决定性作用,而这一分布又与离子注入工艺的主要参数紧密相连。 离子注入
    的头像 发表于 01-21 10:52 2887次阅读
    离子<b class='flag-5'>注入</b>工艺中的重要参数和监控手段

    可控硅的控制奥秘:依赖直流还是交流?

    可控硅是一种重要的半导体器件,通过控制极的触发信号实现对电流的控制。它可以在直流和交流电路中应用,分别用于开关、调节、调光等功能。直流控制和交流控制的特点和应用场景有所不同,但都
    的头像 发表于 01-10 15:44 3014次阅读
    可控硅的<b class='flag-5'>控制</b>奥秘:<b class='flag-5'>依赖</b>直流还是交流?

    字符串反转的实现方式

    在编程中,字符串反转是一个基础而重要的操作,它涉及到将一个字符串中的字符顺序颠倒过来。这个操作在多种编程语言中都有不同的实现方式,本文将探讨几种常见的字符串反转方法。 1. 递归方法 递归是一种通过
    的头像 发表于 01-07 15:27 1240次阅读

    离子注入的目的及退火过程

    产生的晶格损伤,并激活掺杂剂离子,从而实现预期的电学特性。 1. 离子注入的目的 离子注入是现代半导体制造中不可或缺的工艺之一。通过这一步骤,可以精确控制掺杂剂的种类、浓度和分布,以创建半导体器件所需的P型和N型区
    的头像 发表于 01-02 10:22 2297次阅读

    对于低能注入(BR 2K),四点探针测量RS,为什么新针比老针的RS低?而高能注入RS不存在该情况呢

    对于低能注入(BR 2K),四点探针测量RS,为什么新针比老针的RS低?而高能注入RS不存在该情况呢
    发表于 12-20 23:05