依赖注入
Mr.wu edited this page Jul 11, 2017
·
3 revisions
在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。
依赖是程序中常见的现象,比如类Car中用到了GasEnergy类的实例energy,通常的做法就是在Car类中显式地创建GasEnergy类的实例,并赋值给energy。如下面的代码
interface Energy {
}
class GasEnergy implements Energy {
}
class Car {
Energy energy = new GasEnergy();
}
-
类Car承担了多余的责任,负责energy对象的创建,这必然存在了严重的耦合性。举一个现实中的例子,一辆汽车使用哪种能源不是由汽车来决定,而是由汽车制造商(CarMaker)来决定,这是汽车制造商的责任。
-
可扩展性,假设我们想修改能源为电动力,那么我们必然要修改Car这个类,明显不符合开放闭合原则。
-
不利于单元测试。
依赖注入是这样的一种行为,在类Car中不主动创建GasEnergy的对象,而是通过外部传入GasEnergy对象形式来设置依赖。 常用的依赖注入有如下三种方式
将需要的依赖作为构造方法的参数传递完成依赖注入。
class Car {
Energy mEnergy;
public Car(Energy energy) {
mEnergy = energy;
}
}
增加setter方法,参数为需要注入的依赖亦可完成依赖注入。
class Car {
Energy mEnergy;
public void setEnergy(Energy energy) {
mEnergy = energy;
}
}
接口注入,闻其名不言而喻,就是为依赖注入创建一套接口,依赖作为参数传入,通过调用统一的接口完成对具体实现的依赖注入。
interface EnergyConsumerInterface {
public void setEnergy(Energy energy);
}
class Car implements EnergyConsumerInterface {
Energy mEnergy;
public void setEnergy(Energy energy) {
mEnergy = energy;
}
}
接口注入和setter方法注入类似,不同的是接口注入使用了统一的方法来完成注入,而setter方法注入的方法名称相对比较随意。
来自:http://droidyue.com/blog/2015/06/13/talk-show-about-dependency-injection/