架构师之路(5)---IoC框架

1 IoC理论的背景
    我们都知道在面向对象的应用中,软件系统都是由N个对象组成的,它们通过彼此的合作,最终实现业务逻辑。


 
图1:耦合在一起的对象


    如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。上图画的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,来共同完成某项任务。我们可以看到,在齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的运转。


    齿轮组中各个齿轮之间的啮合关系,与软件系统中对象与对象之间的耦合关系,非常类似。对象之间的耦合关系是必要的,是协同工作的基础,当然也是无法避免的,否则无法保证系统整体的正常运转。目前,很多工业级的应用越来越庞大,对象之间的依赖关系也越来越复杂,就会出现对象之间的多重依赖性关系,因此,架构师和设计师对系统进行分析和设计将面临很大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

 

 
图2:对象之间复杂的依赖关系


    耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。
    所以有人就提出来IOC理论,用来实现对象之间的“解耦”,目前已被广泛应用于很多项目中。


2 什么是控制反转(IoC)
    IoC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”,这些都大同小异,我个人觉得这个翻译有待商榷,容易引起歧义,是不是翻译为 “控制转移”会更好一些。
    1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IoC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,读者可以参考我前面的文章,简单来说就是把复杂系统分解成相互合作的对象,这些对象类的内部实现是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IoC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:

 


 图3:IoC解耦示意图


    大家看到了吧,由于引进了中间的“第三方”,也就是IoC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,所有对象的控制权全部上缴给“第三方”,这就是“控制反转”说法的由来,意思就是各个对象的控制权都被转移给“第三方”了。
    从另一个角度来看,作为“第三方”的IoC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是所谓的Ioc容器被称为“粘合剂”的原因。
    我们再把上图中间的Ioc容器拿掉后,整个系统变为这样的情形:
 


图4:拿掉IoC容器后的系统


    拿掉IoC容器后,我们看到的就是系统开发所需要完成的全部内容,这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫不影响,所以当你在实现Class A的时候,根本不用再考虑B、C和D了,系统对象之间的依赖已经降低到了最低程度。至于IoC容器,你可以到开源组织的网站上找一找,里面有很多比较成熟而且Free的,使用起来非常简便。
如果真能实现控制反转,对于系统开发而言,这将是一件多么美好的事情!

 

3 什么是依赖注入(DI)
    我们先看一些生活中的例子,帮助你理解依赖注入(DI):

3.1 主机和内置硬盘
    我们平时所用的电脑,它的硬盘安装在主机里面,从电脑的外部,我们是看不见硬盘的。所以,我们通常认为,电脑的所有部件是融为一体的。
 


图5:主机和内置硬盘


    对于一体机而言,一旦出现了问题,我们可能无法准确地判断到底是什么零部件出现了问题,有可能是CPU坏了,也有可能是主板烧了,还有可能是内存松动了。还有的时候,比如,电脑硬盘出现了问题,可能导致整台电脑都无法使用。从这个例子,我们可以看到部件之间“紧密耦合”的产生的问题:无法准确的定位和诊断故障所在。这种情形,在软件工程的理论中,称之为可理解性和可测试性差。


    如果你想修理电脑的硬盘,那么在修理过程中就必须小心翼翼,不要把其它的部件再搞坏了,比如不慎把内存给碰松动了,硬盘固然是修好了,但整台电脑仍然无法使用。这种情形,在软件工程的理论中,称之为可修改性差。
可理解性、可测试性、可修改性组成了系统的可维护性,一体机的可维护性就表现得比较差。

 

3.2 主机和USB设备
    大家对USB接口和设备应该都很熟悉。自从有了USB接口,给我们使用电脑带来了很大的方便,现在有很多的外部设备都支持USB接口。
 


图6:主机和USB设备

 

    从软件工程角度,我们分析一下USB带来的好处:
1、USB设备作为主机的外部设备,在插入主机之前,与主机没有任何的关系,两者都可独立进行测试,无论两者中的任何一方出现什么的问题,都不会影响另一方的运行,所以可维护性比较好。
2、同一个USB设备可以插接到不同的支持USB的任何主机,也就是USB设备可以被重复利用,所以可复用性比较好。
3、支持热插拔,只要是支持USB接口的设备都可以接入,所以可扩展性比较好,非常灵活。


3.3 依赖注入
    2004年,Martin Fowler从另一个角度来思考这个问题,提出了“哪些方面的控制被反转了?”这样一个问题,并给出了答案:“依赖对象的获得被反转”。于是,他给“控制反转”取了一个他认为更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上点明了实现IoC理论的解决方法。所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。


    依赖注入(DI)和控制反转(IoC)是从不同的角度的描述的同一件事情,都是指通过引入第三方,即IoC容器,实现软件系统中对象之间的解耦。


    控制反转能够带给系统开发的好处,与USB机制带来的好处基本类似,而且依赖注入的实现跟USB机制也完全一样。USB机制是现实中依赖注入的很好的案例。我们用一个实际的例子,分析一下USB机制:


任务:主机通过USB接口读取一个文件。
思路:首先,必须制定一个USB接口标准,主机对USB设备的访问严格按照USB接口标准,USB设备提供的功能也必须符合USB接口标准。
    当主机需要获取一个文件的时候,它直接去读取USB接口,根本不会关心USB接口上连接的是什么设备。
如果我给主机连接上一个U盘,那么主机就从U盘上读取文件;如果我给主机连接上一个外接硬盘,那么主机就从外接硬盘上读取文件。选取何种外部设备的权力由我说了算,也就是控制权归我。
至此,依赖注入的思路已经非常清楚:当主机需要读取文件的时候,我就把它所要依赖的外部设备,挑出来一个,帮他挂接上。这个过程就是一个被依赖的对象在系统运行时被注入另外一个对象内部的过程。在这个过程中,我就起到了IoC容器的作用。


    我们再把依赖注入应用到软件工程中:
    Class A依赖于Class B,当Class A需要用到Class B的时候,IoC容器就会立刻创建一个Class B送给Class A使用。IoC容器就是一个类制造工厂,你需要什么,直接来拿,直接用就可以了,而不需要去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全由IoC容器包办。

 

  4 实现IoC容器

 ----------------------------------------------------

后记:之所以突然跳跃到39,是因为有的同学基础比较好,已经没有必要阅读有关面向对象、设计模式以及软件工程的基本理论,那么可以从这里开始阅读。基础需要继续补全的同学,可以从4继续看,我会定期在两个方向进行更新。框架理论,是架构师知识体系中非常重要的部分,我会逐步结合实例,把常见的一些框架方面的知识与大家共享。

转载于:https://www.cnblogs.com/encounter/archive/2009/03/08/2189049.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】数据库软考笔记(一)第一章 计算机硬件基础知识笔记总结

转自:https://blog.csdn.net/qq_36411874/article/details/115057569 目录 运算器:ALU、AC、DR、PSW 控制器:IR、PC、AR、ID 寄存器组(了解即可) 存储器 存储器与总线(了解,考分类&#xf…

Vlan的转发过程

untag就是普通的ethernet报文,普通PC机的网卡是可以识别这样的报文进行通讯; tag报文结构的变化是在源mac地址和目的mac地址之后,加上了4bytes的vlan信息,也就是vlan tag头; 一般来说这样的报文普通PC机的网卡是不能…

翻转课堂说教案计算机,计算机学院崔海文:对翻转课堂的进一步认识与思考

近期我有幸参加了学校教师发展中心组织的信息化教学培训班,认真聆听了各位教授的讲座,收获颇多。傅钢善教授的报告《信息技术环境下如何上好一堂课》让我的收获最大,教授的讲座宛如一顿丰盛的大餐,生动且不失严谨的呈现在大家面前…

Dos下命令运行带有包名的Java类

这几天在回顾原来的知识,发现知识一段时间不整理的话很多东西手生的很,今天刚刚想在dos下运行一个java类却出错了.Exception in thread "main" java.lang.NoClassDefFoundError 为什么呢?后面找了许久发现是类中带有包名的问题. 1.当类没有包…

嵌入式的基础知识

1.嵌入式操作系统结构 一般情况下分为硬件子系统和软件子系统; 硬件子系统主要包括:CPU小系统,电源模块,调试模块,时钟模块,接口模块,复位和配置模块; 软件子系统主要包括&#x…

【转】DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

转自:https://www.cnblogs.com/mfrbuaa/p/4004114.html 有修订 背景介绍: 近期项目需求,需要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发。在C语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段…

量子计算机的核心元件简称,计算机文化基础复习题(含答案).doc

计算机文化基础复习题(含答案)整理计算机文化基础复习题第一套一、单项选择题(每题1分,共30分)1、在Powerpoint2003中,若为幻灯片中的对象设置"驶入效果",应选择对话框 (? )???? A、自定义放映???? B、幻灯片版式????…

xfire客户端对返回list很挑剔,所以需要使用泛型。

casldap异常分析 | xfirewebservice(服务器配置篇) 2008-12-31xfirewebservice(客户端调用篇) 服务接口,就是用来调用的,所以客户端显得尤为重要,xfire客户端对返回list很挑剔,所以需要使用泛型。 如何建立webservice client 步骤…

C语言关键字----Const

C中CONST的使用:   虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。   问题:const变量 & 常量   为什么下面的例子在使用一个const变量…

【转】DICOM的常用Tag分类和说明!!!!

转自:https://www.cnblogs.com/stephen2014/p/4579443.html 有删改 1. 前言: 基于DICOM3.0标准的医学图像中,每一张图像中都携带着许多的信息,这些信息主要可以分为Patient, Study, Series和Image四类。每一个DICOM Tag都是…

计算机卡在无法显示网页,我的电脑上网上银行一直“无法显示网页”

首先:打开一个网页,点击“工具”--internet选项--高级--还原默认设置--应用--确定 其次:使用这个修复工具试一试&#xff…

在虚拟机上运行vxWorks

Vxworks是一个嵌入式系统,主要运行在arm、ppc、mips等嵌入式处理器上,它同样可以运行在X86处理器上。风河公司开发的tornado开发环境就 包括了pentium版本,并且发布了相应的bsp。因此我们可在vmware虚拟机上运行vxworks,利用虚拟机…

【转】成熟的医学影像“调窗”(window-leveling)算法详解

转自:http://blog.sina.com.cn/s/blog_4bce5f4b0100o9iy.html 图像显示和打印面临的一个问题是:图像的亮度和对比度能否充分突出关键部分。这里所指的“关键部分”在 CT 里的例子有软组织、骨头、脑组织、肺、腹部等等。 技术问题: 显示…

南京大学计算机系副教授名单,2018年度国际“人工智能10大新星”名单公布:南京大学俞扬副教授国内高校入选者...

中公考研小编为各位考研小伙伴们整理了关于2018年度国际“人工智能10大新星”名单公布:南京大学俞扬副教授国内高校唯一入选者的相关资讯文章,一起了解一下吧~日前,国际人工智能领域著名杂志 IEEE Intelligent Systems 发布了2018年度“人工智…

使用SDL打造游戏世界之入门篇 - 7

打开和显示图片在这个例子里我们将学习如何使用SDL程序中打开和显示图片。示例程序将绘制一个漂亮的背景,上面显示一个正方形图案,并可以使用键盘的方向键移动它。如果比较熟悉“推箱子”这个游戏,可以看出这个程序实际就是推箱子游戏的基础。…

WDB

1. 符号表同步貌似只能是target shell下载后,能够在host shell下更新,当host shell下载的话,target shell是无法更新的。 2. host shell下执行某一个函数的时候,WDB会自动生成一个新的任务来运行,这个任务的IO将被重定…

【转】GPS从入门到放弃(一) --- GPS基础原理

转自:https://blog.csdn.net/tyst08/article/details/100529424 GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带G…

计算机系统的物质实体,计算机基础-(-第1次-).pdf

计算机基础 -(- 第 1 次-)第 1 次作业一、填空题(本大题共 30 分,共 10 小题,每小题 3 分)1. 二进制数求积 011 ______ 。2. 计算机系统是由 _ ______ 和 ______ _ 两大部分组成的。3. 八个二进制位称为一个 ______ ,是计算机的最小存储单元。…

JS判断数字/字母/中文

原文链接:http://tieba.baidu.com/f?kz140213674 1JS判断数字/字母/中文 1. var reg /^(\w|[\u4E00-\u9FA5])*$/; if(arrusername.match(reg)) { ti1; return ture; } else { alert("用户名只允许为英文,数字和汉字的混合,\n请检查是否前后有…

【转】10个推荐的 PACS/DICOM Server开源项目

10个推荐的 PACS/DICOM Server开源项目 转自:https://zhuanlan.zhihu.com/p/65437040 soolaugust 喜欢我的分享可以关注公众号:雨夜随笔 35 人赞同了该文章 本文仅授权给公众号:雨夜随笔, 欢迎关注 本文翻译自:To…