控制反转

Posted on 2004-08-31 09:35  数码民工  阅读(1226)  评论(1编辑  收藏  举报
接触这个概念是在学习spring之前,学习了spring之后这个概念也更加的明晰了。不过虽然自己明白但是却不能道明其准确含义。今天无疑中又看到了一篇对控制反转进行讲解的文章,感觉通俗易懂,特摘抄如下:

何谓控制反转(IoC = Inversion of Control),何谓依赖注入(DI = Dependency Injection)?
对于初次接触这些概念的初学者,不免会一头雾水。正如笔者第一次看到这些名词一样,一阵窘迫……
IT界不亏是哄抢眼球的行业,每个新出现的语汇都如此迷离。好在我们也同时拥有Internet这个最
广博的信息来源。
IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也
就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
正在业界为IoC争吵不休时,大师级人物Martin Fowler也站出来发话,以一篇经典文章《Inversion
of Control Containers and the Dependency Injection pattern》为IoC正名,至此,IoC又获得了
一个新的名字:“依赖注入(Dependency Injection)”。
相对IoC 而言,“依赖注入”的确更加准确的描述了这种古老而又时兴的设计理念。从名字上理解,
所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关
系注入到组件之中。
为什么称之为“古老而又时兴”的设计理念?至于“时兴”自然不必多费唇舌,看看国内外大小论坛
上当红的讨论主题便知。至于“古老”……,,IBM T40笔记本电脑一台、USB硬盘和U盘各一只。想必大家在日常
工作中也有类似的一套行头。
这与依赖注入有什么关系?
图中三个设备都有一个共同点,都支持USB 接口。当我们需要将数据复制到外围存储设备时,可以
根据情况,选择是保存在U盘还是USB硬盘,下面的操作大家也都轻车熟路,无非接通USB接口,然后
在资源浏览器中将选定的文件拖放到指定的盘符。
这样的操作在过去几年中每天都在我们身边发生,而这也正是所谓依赖注入的一个典型案例,上面称
之为“古老”想必也不为过分。
再看上例中,笔记本电脑与外围存储设备通过预先指定的一个接口(USB)相连,对于笔记本而言,
只是将用户指定的数据发送到USB接口,而这些数据何去何从,则由当前接入的USB设备决定。在USB
设备加载之前,笔记本不可能预料用户将在USB接口上接入何种设备,只有USB设备接入之后,这种设
备之间的依赖关系才开始形成。
对应上面关于依赖注入机制的描述,在运行时(系统开机,USB 设备加载)由容器(运行在笔记本
中的Windows操作系统)将依赖关系(笔记本依赖USB设备进行数据存取)注入到组件中(Windows
文件访问组件)。
这就是依赖注入模式在现实世界中的一个版本。
很多初学者常常陷入“依赖注入,何用之有?”的疑惑。想来这个例子可以帮助大家简单的理解其中
的含义。依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建
一个灵活、可扩展的平台。将USB接口和之前的串/并、PS2接口对比,想必大家就能明白其中的意味。

Copyright © 2024 数码民工
Powered by .NET 8.0 on Kubernetes