依赖反转(Dependency inversion principle)和控制反转(Inversion of Control)

有两个对象A和B,A some B  是A依赖于B,当B some A的时候是B依赖于A这就叫依赖反转;

这种依赖关系如果让程序员自己控制(new 对象),就会出现高耦合,控制反转(依赖注入)就是让这种依赖关系由第三方管理(eg:spring)而不是程序员自己管理。

名词解释

依赖:一种模型元素之间的关系的描述。例如类A调用了类B,那么我们说类A依赖于类B。

耦合:一种模型元素之间的关系的描述。例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系。

耦合度:模型元素之间的依赖程度的量化描述。

控制:一种模型元素之间的关系的描述。例如类A调用了类B,那么我们说类A控制类B。

绪论

架构设计的对象一般是类库、框架和应用程序。其工作任务除了类库、框架、应用程序各个模块(类)之间的关系设计之外,还包括类库、框架和应用程序三者之间关系的设计。而依赖倒置、控制反转、依赖注入正是常用的一类设计模式。

依赖倒置、控制反转、依赖注入三者含义和目标基本一致,即通过抽象接口解耦和消除依赖关系。

依赖倒置

从字面理解依赖倒置往往不知所云,通过了解其历史渊源可以很好的消除这种误解。在面向结构编程时代,架构设计师往往采用自上而下的设计模式,先设计上层模块,再设计下层模块,如此层层分解,导致上层模块严重依赖于下层模块,下层模块的一点变化都会导致上层地震。到了面向对象编程时代,架构设计师使用对象进行设计,通过抽象接口解耦各层之间的依赖关系,为了与面向结构的设计模式区分开,同时体现面向对象的优势,也为了哗众取宠,就给这种新的设计模式起了个依赖倒置的名称。

依赖倒置的核心思想是依赖于抽象。

依赖倒置的原则是上层模块不依赖于下层模块,而是依赖于一套抽象接口,上层模块调用接口,下层模块实现接口。以类库和应用程序为例,我们把应用程序需要调用的功能抽象为一组接口,然后由类库实现这组接口,那么应用程序就可以使用任意实现了该接口的类库,从而和类库解耦。

控制反转

控制反转的来历与依赖倒置相似,以前设计应用程序,虽然会引用类库,但一切都在应用程序的控制之中。后来根据应用程序的不同场景,人们设计了相应的框架,有了框架之后,再设计应用程序时,就变成了为框架增加自定义行为的设计,控制权转到了框架手里,因此说控制权反转了。

控制反转是依赖倒置的一种具体实现,强调的是控制流程的依赖倒置,是框架设计的必用模式。框架基于依赖倒置模式设计:对于框架中不确定的部分,框架抽象出一组接口,并依赖于这组接口进行实现,应用程序实现这组接口。

依赖注入

依赖注入也是依赖倒置的一种具体实现,是类库设计的一种常用模式。类库中的类基于依赖模式设计:某类依赖于接口,而不是具体的实现,由调用者在调用时传入这些接口的具体实现类。

.Net中广泛使用此模式,比如StreamReader类,当使用StreamReader时,需要实例化一个Stream或其派生类,传给StreamReader的构造函数,然后方能使用该类的方法。

弊病

依赖倒置的基础是假设抽象是稳定的。对于我们已经了解的事物,当然可以实现很好的抽象,但对于尚未认识清楚的事物,比如用户需求,就很难保证这个抽象的稳定性。因此一旦这个抽象稳定的假设不成立,那么依赖倒置不但不能发挥优势,反倒可能成为包袱。

依赖反转(Dependency inversion principle)和控制反转(Inversion of Control),布布扣,bubuko.com

时间: 2024-10-24 19:27:21

依赖反转(Dependency inversion principle)和控制反转(Inversion of Control)的相关文章

Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

一.思想理解 Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运行.Spring将各层的对象以松耦合的方式组织在一起,Action对象无须关心Service对象的具体实现,Service对 象无须关心持久层对象的具体实现,各层对象的调用完全面向接口.当系统需要重构时,代码的改写量将大大减少. 上面所说的一切都得宜于Spring的核心机制,依赖注入.依赖注入让bean与

依赖注入(DI)和控制反转(IOC)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

ASP.NET Core中的依赖注入(1):控制反转(IoC)

ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化",我们将这些标准化的组件称为服务,ASP.NET在内部专门维护了一个DI容器来提供所需的服务.要了解这个DI容器以及现实其中的服务提供机制,我们先得知道什么是DI(Dependence Injection),而一旦我们提到DI,又不得不说IoC(Inverse of Control). 目录 一.流程控

Inversion of Control Containers and the Dependency Injection pattern(控制反转和依赖注入模式)

本文内容 Components and Services A Naive Example Inversion of Control Forms of Dependency Injection Constructor Injection with PicoContainer Setter Injection with Spring Interface Injection Using a Service Locator Using a Segregated Interface for the Loc

依赖倒置,控制反转,依赖注入

好的文章,总是担心消失,自己保存一遍,这里是原文 向依赖关系宣战 依赖倒置.控制反转和依赖注入辨析在<道法自然——面向对象实践指南>一书中,我们采用了一个对立统一的辩证关系来说明“模板方法”模式—— “正向依赖 vs. 依赖倒置”(参见:<道法自然>第15章[王咏武, 王咏刚 2004]).这种把“好莱坞”原则和 “依赖倒置”原则等量齐观的看法其实来自于轻量级容器PicoContainer主页上的一段话: “控制反转(Inversion of Control)的一个著名的同义原则是

控制反转(IoC)与依赖注入(DI)

前言 最近在学习Spring框架,它的核心就是IoC容器.要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式.下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Spring中如何应用. 什么是控制反转? 什么是依赖注入? 它们之间有什么关系? 如何在Spring框架中应用依赖注入? 什么是控制反转 在讨论控制反转之前,我们先来看看软件系统中耦合的对象.图1:软件系统中耦合的对象从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是互相耦合,一个零件不能正常工

依赖注入与控制反转

抄自:http://blog.xiaohansong.com/2015/10/21/IoC-and-DI/ 找不到比这更清楚明白的了 场景:对象A依赖于对象B 控制反转: 控制反转前:由在类A中初始化B,对象A控制着对象B的初始化和使用, 控制反转后:对象B的初始化在对象A需要时由容器初始化并注入到对象A中,控制权在容器手上. 对象A对对象B的依赖,由主动变成了被动,控制权颠倒过来了,对象A与B解耦 依赖注入:就是将实例变量传入到一个对象中去.非自己主动初始化依赖,而通过外部来传入依赖的方式 前

ASP.NET MVC进阶之路:深入理解依赖注入(DI)和控制反转(IOC)

0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行.详细的介绍可以阅读上一篇博文:http://www.cnblogs.com/dazhuangtage/p/5672190.html 0X2 什么是控制反转 在解释什么是控

依赖、依赖倒置、控制反转、依赖注入

1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它.下面看一个简单的示例: /// <summary> /// 用户播放媒体文件 /// </summary> public class OperationMain { public void PlayMedia() { MediaFile _mtype = new MediaFile(); Pla

轻松了解Spring中的控制反转和依赖注入

我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级JavaBean(Enterprise JavaBean ,EJB)在创建之初是非常成功,但是时间一久人们便开始追逐更加方便更加简易和轻量级的技术框架实现,于是Spring就应运而生,并且Sring一直开始不断地涉及到其他领域(这里就不再多详谈了),而Spring的精髓当中就包括控制反转和依赖注入. 浅