依赖倒置与控制反转
DI依赖倒置
首先是依赖倒置原则:
1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
举例:pizza店
无依赖倒置:
有依赖倒置:
可以看出,上层的Pizza店依赖于抽象的接口Pizza,而不是直接依赖下层的细节实现对象。
总结:
- 上层依赖抽象
- 细节依赖抽象
IOC控制反转
其次,控制反转,依赖注入是实现依赖倒置的一种方法。
依赖倒置原则,控制反转IOC,依赖注入DI
降低耦合
不用在上层类中调用下层的构造函数,而是直接将下层的对象构造好了之后传入上层类。
1
2
3
4
5
6
7class Car{
private Framework f;
Car(){
// 如果下层的FrameWork类变动,需要传入参数,这个上层的Car类也需要改
this.f = new FrameWork();
}
}修改使用依赖倒置后,会变成:
1
2
3
4
5
6
7class Car{
private FrameWork f;
// 这样直接传入下层类对象过来就行了,而不需要具体关心其实现
Car(FrameWork f){
this.f = f;
}
}上面是构造方法传入,还有Set传递和接口传递