【设计模式】控制反转(IoC)与依赖注入(DI)

来源:互联网 发布:ajax跨域请求不是json 编辑:程序博客网 时间:2024/06/04 19:40

控制反转和依赖注入实际做的就是同一件事情,只不过实现角度不同,在此我把它们划为一类。

1,概念

1)控制反转

是框架的重要特征。成熟较晚,故未包含在GOF种。

控制反转把对象生成放在XML种,当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口),只要修改XML即可,实现了对象的热插拔。

同时,IoC的对象生成使用了反射变成,损耗了效率,但提高了维护性和灵活性。另外,重构较为困难,如果更改了类名,还需要在xml文件种手动修改。

2)接口驱动

接口驱动可以提供不同灵活的子类实现,增加代码稳定和健壮性。

2,实现

1)依赖查找

容器提供回调接口和上下文条件给组件。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上:容器将调用这些回调方法,从而让应用代码获得相关资源。

从容器的角度描述:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

2)依赖注入

依赖注入(Dependency Injection,DI)
DI是一个重要的面向对象编程法则来削减计算机程序的耦合问题M降低了组件之间的耦合性。

从应用程序的角度:应用程序依赖容器创建并注入它所需要的外部资源。

可以使应用程序的配置和依赖性规范与实际的应用程序代码分开。通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。

DI使用接口编程,在对象使用时动态注入。
有3种注入方式:

①>构造函数注入(Contructor Injection)

最简单的依赖注入方式.

public class MovieLister {    private MovieFinder finder;    public MovieLister(MovieFinder finder) {        this.finder = finder;    }    ...}

②setter注入

public class MovieLister {    s...    public void setFinder(MovieFinder finder) {        this.finder = finder;    }}

③接口注入

接口注入使用接口来提供setter方法,其实现方式如下。
首先要创建一个注入使用的接口。

public interface InjectFinder {    void injectFinder(MovieFinder finder);}
class MovieLister implements InjectFinder {    ...    public void injectFinder(MovieFinder finder) {      this.finder = finder;    }    ...}