通过实例理解IoC 的概念

  贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓来让人应接
不暇。在所有贺岁大片中,张之亮的《墨攻》算是比较出彩的一部。该片讲述了战国时期
墨家人革离帮助梁国反抗赵国侵略的个人英雄主义故事,恢宏壮阔、浑雄凝重的历史场面
相当震撼。其中有一个场景:当刘德华所饰演的墨者革离到达梁国都城下,城上梁国守军
问到:“来者何人?”刘德华回答:“墨者革离!”我们不妨通过一个Java 类为这个“城门
叩问”的场景进行编剧,并借此理解IoC 的概念:

代码清单 3-1 MoAttack:通过演员安排剧本

public class MoAttack {
    public void cityGateAsk(){
    //①演员直接侵入剧本
    LiuDeHua ldh = new LiuDeHua();
    ldh.responseAsk("墨者革离!");
    }
}

我们会发现以上剧本在①处,作为具体角色饰演者的刘德华直接侵入到剧本中,使剧
本和演员直接耦合在一起(图3-1)。

图 3-1 剧本和演员直接耦合

  一个明智的编剧在剧情创作时应围绕故事的角色进行,而不应考虑角色的具体饰演
者,这样才可能在剧本投拍时自由地遴选任何适合的演员,而非绑定在刘德华一人身上。
通过以上的分析,我们知道需要为该剧本主人公革离定义一个接口:

代码清单 3-2 MoAttack:引入剧本角色

public class MoAttack {
    public void cityGateAsk()
    {
    //①引入革离角色接口
    GeLi geli = new LiuDeHua();
    //②通过接口开展剧情
    geli.responseAsk("墨者革离!");
    }
}

在①处引入了剧本的角色——革离,剧本的情节通过角色展开,在拍摄时角色由演员
饰演,如②处所示。因此墨攻、革离、刘德华三者的类图关系如图3-2 所示:

            图 3-2 引入角色接口后的关系

  可是,从图3-2 中,我们可以看出MoAttack 同时依赖于GeLi 接口和LiuDeHua 类,
并没有达到我们所期望的剧本仅依赖于角色的目的。但是角色最终必须通过具体的演员才
能完成拍摄,如何让LiuDeHua 和剧本无关而又能完成GeLi 的具体动作呢?当然是在影片
投拍时,导演将LiuDeHua 安排在GeLi 的角色上,导演将剧本、角色、饰演者装配起来(图
3-3)。

              图 3-3 剧本和饰演者解耦了

  通过引入导演,使剧本和具体饰演者解耦了。对应到软件中,导演像是一个装配器,
安排演员表演具体的角色。
现在我们可以反过来讲解IoC 的概念了。IoC(Inverse of Control)的字面意思是控制
反转,它包括两个内容:
? 其一是控制
? 其二是反转
那到底是什么东西的“控制”被“反转”了呢?对应到前面的例子,“控制”是指选
择GeLi 角色扮演者的控制权;“反转”是指这种控制权从《墨攻》剧本中移除,转交到导
演的手中。对于软件来说,即是某一接口具体实现类的选择控制权从调用类中移除,转交

给第三方决定。

  因为 IoC 确实不够开门见山,因此业界曾进行了广泛的讨论,最终软件界的泰斗级
人物Martin Fowler 提出了DI(依赖注入:Dependency Injection)的概念用以代替IoC,
即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用
类对某一接口实现类的依赖。“依赖注入”这个名词显然比“控制反转”直接明了、易于
理解。

时间: 2024-12-23 04:21:16

通过实例理解IoC 的概念的相关文章

看部电影,透透彻彻理解IoC(你没有理由再迷惑!)

引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓来让人应接不暇.在所有贺岁大片中,张之亮的<墨攻>算是比较出彩的一部.该片讲述

透彻理解Ioc

引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能在此基础上开花结果.但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,这不能不说是一大遗憾.不过IoC确实包括很多内涵,它涉及代码解耦.设计模式.代码优化等问题的考量,我们打算通过一个小例子来说明这个概念. 通过实例理解IoC的概念 贺岁大片在中国已经形成了一个传统,每到年底总有多部贺岁大片纷至沓来让人应接不暇.在所有贺岁大片中,张之亮的<墨攻>算是比较出彩的一部.该片讲述

如何理解IoC/DI

IoC:Inversion of Control,控制反转DI:Dependency Injection,依赖注入 要理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁?依赖:谁依赖于谁?为什么需要依赖?注入:谁注入于谁?到底注入什么?控制反转:谁控制谁?控制什么?为什么叫反转(有反转就应该有正转了)?依赖注入和控制反转是同一概念吗? 下面就来简要地回答一下上述问题,把这些问题搞明白了,也就明白IoC/DI了.(1)参与者都有谁:一般有三方参与者,一个是某个对象:另一个是IoC/DI容器(

深入理解IoC/DI

------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁? 控制什么? 为何叫反转(对应于正向)?哪些方面反转了?为何需要反转? 谁控制谁?  --> IoC/DI容器控制应用程序 控制什么? --> IoC/DI容器控制对象本身的创建.实例化; IoC/DI容器控制对象之间的依赖关系 为何叫反转(对应于正向)? --> 因为现在应用程序不能主动

转:深入理解JavaScript闭包概念

闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这样的基本概念理解较好的话,理解闭包的概念并在实际的编程实践中应用则颇有水到渠成之感. 在DOM的事件处理方面,大多数程序员甚至自己已经在使用闭包了而不自知,在这种情况下,对于浏览器中内嵌的JavaScript引擎的bug可能造成内存泄漏这一问题姑且不论,就是程序员自己调试也常常会一头雾水. 用简单的语句来描述JavaScript中的闭

深度理解IOC

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务.我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮

简单理解IoC与DI

为了理解Spring的IoC与DI从网上查了很多资料,作为初学者,下面的描述应该是最详细,最易理解的方式了. 首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号………,想办法认识她们,

Spring4- 01 - Spring框架简介及官方压缩包目录介绍- Spring IoC 的概念 - Spring hello world环境搭建

一. Spring 框架简介及官方压缩包目录介绍 主要发明者:Rod Johnson 轮子理论推崇者: 2.1 轮子理论:不用重复发明轮子. 2.2 IT 行业:直接使用写好的代码. Spring 框架宗旨:不重新发明技术,让原有技术使用起来更加方便. Spring 几大核心功能 4.1 IoC/DI控制反转/依赖注入 4.2 AOP面向切面编程 4.3 声明式事务. Spring 框架runtime 5.1 test: spring 提供测试功能 5.2 Core Container:核心容器

深入理解Java闭包概念

闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关引用环境组成的实体. 注:<自由变量>:除了局部变量的其他变量 简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量. Java中闭包实现 关键点: 如何用变量去存储方法? java中能够保存方法的变量指的就是普通的对象 如何让这个普通对象能够访问所在类的自由变量?