IoC全名Inversion of Control,如果中文硬要翻译过来的话,就是「控制反转」。初看IoC,从字面上不容易了解其意义,我觉得要了解IoC,要先从Dependency Inversion开始了解,也就是依赖关系的反转。
Dependency Inversion在下面这篇文章中有了清楚的解释:
http://www.objectmentor.com/publications/dip.pdf
简单的说,在模块设计时,高层的抽象模块通常是与业务相关的模块,它应该具有重用性,而不依赖于低层的实作模块,例如如果低层模块原先是软盘存取模式,而高层模块是个存盘备份的需求,如果高层模块直接叫用低层模块的函式,则就对其产生了依赖关系。
举个例子,例如下面这个程序:
#include <floppy.h>
....
void save() {
....
saveToFloppy()
}
}
由于save()程序依赖于依赖于saveToFloppy(),如果今天要更换低层的存储模块为Usb碟,则这个程序没有办法重用,必须加以修改才 行,低层模块的更动造成了高层模块也必须跟着更动,这不是一个好的设计方式,我们希望模块都依赖于模块的抽象,这样才可以重用高层的业务设计。
如果以对象导向的方式来设计,依赖反转(Dependency Inversion)的解释变为程序不应依赖实作,而是依赖于抽象,实作必须依赖于抽象。我们来看看下面这个Java程序:
BusinessObject.java
public class BusinessObject {
private FloppyWriter writer = new FloppyWriter();
....
public void save() {
...
writer.saveToFloppy();
}
}
在这个程序中,BusinessObject的存盘依赖于实际的FloppyWriter,如果今天我们想要将存盘改为存至Usb碟,我们必须修改或继承BusinessObject进行扩展,而无法直接使用BusinessObject。
如果透过接口的宣告,可以改进此一情况,例如:
public interface IDeviceWriter {
public void saveToDevice();
}
public class BusinessObject {
private IDeviceWriter writer;
public void setDeviceWriter(IDeviceWriter writer) {
this.writer = writer;
}
public void save() {
....
writer.saveToDevice();
}
}
这样一来,BusinessObject就是可重用的,如果今天我有存储至Floppy或Usb碟的需求,我只要实作IDeviceWriter即可,而不用修改BusinessObject:
public class FloppyWriter implement IDeviceWriter {
public void saveToDevice() {
....
// 实际储存至Floppy的程序代码
}
}
public class UsbDiskWriter implement IDeviceWriter {
public void saveToDevice() {
....
// 实际储存至UsbDisk的程序代码
}
}
从这个角度来看,Dependency Inversion的意思即是程序不依赖于实作,而是程序与实作都要依赖于抽象。
IoC的Control是控制的意思,其实其背后的意义也是一种依赖关系的转移,如果A依赖于B,其意义即是B拥有控制权,我们要转移这种关系,所以依 赖关系的反转即是控制关系的反转,藉由控制关系的转移,我们可以获得组件的可重用性,在上面的Java程序中,整个控制权从实际的 FloppyWriter转移至抽象的IDeviceWriter接口上,使得BusinessObject、FloppyWriter、 UsbDiskWriter这几个实现依赖于抽象的IDeviceWriter接口。
从容器(Container)的角度,程序的业务逻辑部份应是可以重用的,不应受到所使用框架或容器的影响,因为我们可能转移整个业务逻辑至其它的框架或容器,如果业务逻辑过于依赖容器,则转移至其它的框架或容器时,就会发生困难。
IoC在容器的角度,可以用这么一句好莱坞名言来代表:"Don't call me, I'll call you." 以程序的术语来说的话,就是「不要向容器要求您所需要的(对象)资源,容器会自动将这些对象给您!」。IoC要求的是容器不侵入应用程序本身,应用程序本身提供好接口,容器可以透过这些接口将所需的资源注至至程序中,应用程序不向容器主动要求资源,故而不会依赖于容器的组件,应用程序本身不会意识到正被容 器使用,可以随时从容器中脱离转移而不用作任何的修改,而这个特性正是一些业务逻辑中间件最需要的。
分享到:
相关推荐
【Android应用开发中控制反转IoC设计模式使用教程】 IoC(Inversion of Control,控制反转)是一种设计模式,常被称为依赖注入(Dependency Injection,DI)。在Android应用开发中,IoC模式能够显著降低组件之间的...
本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...
**Spring框架中的IoC(控制反转)概念** 在软件开发中,IoC(Inversion of Control,控制反转)是一种设计模式,它将对象的创建和管理责任从代码中剥离出来,交由一个容器来处理。Spring框架是Java平台上的一个核心...
在Spring Boot框架中,控制反转(Inversion of Control,简称IOC)是一种重要的设计原则,它将对象的创建和管理权交给容器(在这里是Spring框架),从而解耦了应用的组件。面向接口编程则是另一种核心原则,它提倡...
浅析SpringBoot通过面向接口编程对控制反转IOC的理解 控制反转(IOC)是一种设计思想,而不是一种技术。它将对象的控制权交给容器,而不是传统的在对象内部直接控制。IOC的关键是要明确“谁控制谁,控制什么,为何...
【Spring框架IoC控制反转】 一、Spring框架是什么 Spring框架是Java开发中的一款轻量级框架,诞生于2003年,旨在简化企业级应用的开发复杂性。Spring的核心理念包括控制反转(IoC)和面向切面编程(AOP)。作为一...
### Spring IOC控制反转详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,提供了全面的基础架构支持,让开发者能够轻松地开发出松耦合的应用程序。它通过依赖注入(Dependency Injection, DI)和...
控制反转(IoC)在Java开发中的应用 控制反转(Inversion of Control,英文缩写为IoC)是Java开发中的一种重要的设计模式,它的主要思想是将对象的创建和管理交给容器来处理,而不是在类内部控制。这称为控制反转。...
本文主要关注的是Spring.NET的核心特性——控制反转(Inversion of Control,简称IoC)。 控制反转是一种设计模式,它将对象的创建和依赖关系的管理从应用代码中解耦出来。通过IoC,对象不再负责创建和管理其依赖项...
"IoC(控制反转)"是软件设计模式中的一个重要概念,它在现代软件开发,特别是.NET框架下的C#编程中占据了核心地位。控制反转的主要思想是将对象之间的依赖关系从代码内部转移到外部容器,从而使代码更加灵活、可...
spring IOC控制反转 spring IOC控制反转 spring IOC控制反转
Spring框架有两个非常关键的特性:IoC(控制反转)和AOP(面向切面编程)。 ### IoC(Inverse of Control)控制反转 IoC是Spring框架中最基础且重要的概念之一。通过IoC,对象的创建以及对象之间的依赖关系不再由...
**Spring技术--IOC控制反转** 在Java开发领域,Spring框架以其强大的功能和广泛的应用而闻名。其中,IOC(Inversion of Control,控制反转)是Spring的核心特性之一,它改变了传统对象创建和管理的方式,实现了依赖...
IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从代码控制剥离到容器控制。这样做的目的是为了降低耦合度,提高系统的灵活性和可维护性。在 Spring 中,我们使用 XML 文件来配置...
#### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行时控制流的方向发生了“反转...
基于annotation注解方式理解SpringIOC控制反转
本文文档中有 控制反转 DI依赖注入,希望可以给大家在技术上有一点的帮助
### IOC控制反转在代码中的体现 #### 一、IOC(Inversion of Control)概念解析 IOC,即控制反转,是一种设计思想,在Java开发领域中,它主要被用来消除程序之间的依赖性,使得类的设计更加灵活。传统的编程模式下...
Spring.NET 控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理...