控制反转

控制反转是一种思想,Inversion of Control,缩写为IoC,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。参考

为什么要用控制反转的思想

主要是为了高内聚、低耦合

高内聚

模块内部要高度聚合

低耦合

模块和模块之间的耦合度要尽量低

高耦合的问题 - 依赖过多

从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是互相耦合,一个零件不能正常工作,整个系统就崩溃了。这是一个强耦合的系统。齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

Apple apple;public AppleX(){apple = new Apple();
}
//AppleX对Apple有依赖
//如果new Apple()很慢的话,单测就很困难
//Apple的创造方式发生变化,比如说,Apple(String version)

高耦合的解决 - 控制反转

为了解决对象间耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”。

控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。

Dependency injection是控制反转的一种技术,简而言之,就是不经过自己初始化依赖,而通过外部(第三方)来传入依赖的方式。

实例的创建工作交给容器来完成

由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

Dependency injection(依赖注入)

Apple apple;public AppleX(Apple apple){this.apple = apple;
}
//Apple 已经在外部初始化

Inject现实例子

一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。

第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。

所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。


想要看到更多玮哥的学习笔记、考试复习资料、面试准备资料?想要看到IBM工作时期的技术积累和国外初创公司的经验总结?

敬请关注:

玮哥的博客 —— CSDN的传送门

玮哥的博客 —— 简书的传送门

玮哥的博客 —— 博客园的传送门

玮哥的博客 —— 51Testing的传送门

转载于:https://www.cnblogs.com/vigorz/p/10501927.html

设计模式之控制反转和依赖注入的使用小结相关推荐

  1. php程序设计依赖注入_PHP控制反转和依赖注入

    [TOC] PHP和依赖注入 理论知识 要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversio ...

  2. 架构设计之依赖倒置、控制反转与依赖注入

    名词解释 依赖:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A依赖于类B. 耦合:一种模型元素之间的关系的描述.例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系. ...

  3. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  4. Spring框架中的控制反转和依赖注入

    控制反转: 控制反转是用来降低代码之间的耦合度的,基本思想就是借助"第三方"实现具有依赖对象的解耦. 为什么需要控制反转,因为项目中对象或多或少存在耦合.控制反转的关键在于Ioc容 ...

  5. 控制反转_.NET Core ASP.NET Core Basic 12 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  6. 一篇文章讲透控制反转和依赖注入

    https://www.jianshu.com/p/07af9dbbbc4b 转载链接:http://blog.xiaohansong.com/2015/10/21/IoC-and-DI/# http ...

  7. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

  8. Spring控制反转和依赖注入的好处

    要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle ). 什么是依赖 ...

  9. java json injection_Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

最新文章

  1. php高级技术考试题,PHP高级技术考试题.doc
  2. 外部表External table
  3. windoes硬盘备份(数据迁移)的方法
  4. Element Swapping
  5. Spork: Pig on Spark实现分析
  6. NLP简报(Issue #3)
  7. 随机生成指定个数学生的语文数学外语成绩并求平均值
  8. 二维前缀和(附模板题)
  9. OpenCV图像处理基础(变换和去噪)
  10. 【情感识别】基于matlab GUI SVM语音情感识别(带面板)【含Matlab源码 876期】
  11. oracle 存储过程 转换为mysql存储过程 实例总结 (数据库有感篇一)
  12. 考研复试数据库知识总结
  13. 求解哈夫曼编码Java实现,哈夫曼编码(Java)
  14. 【mybatis plus源码解析】(三)自定义SQL注入器,教你如何自定义扩展BaseMapper接口方法,实现更多查询
  15. 【工控老马】欧姆龙PLC FINS指令模板整理
  16. 心理账户--《别做正常的傻瓜》摘记1
  17. cmf php,php cmf
  18. 在Android终端模拟器中操作adb调试命令
  19. Minkowski不等式
  20. 车联网未来发展会是怎么样的呢

热门文章

  1. HUST 1541 Student’s question
  2. 《DSP using MATLAB》Problem 6.12
  3. Mysqldump逻辑备份与恢复
  4. 详解JMeter函数和变量
  5. 【翻译】WPF应用程序模块化开发快速入门(使用Prism+MEF)
  6. 日美“利刃”联合军演
  7. c#文本框只能填入数字和字母
  8. qt for 3520a
  9. 11.7 iostat: I/O信息统计
  10. java打开文件出错_打开文件错误太多,java.io.FileNotFoundException