什么是依赖倒置?
- 高层模块不应该依赖底层模块,两者都依赖其抽象对象
- 抽象不依赖细节
- 细节应该依赖于抽象
传统的过程性系统设计办法倾向于高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。“倒置”原则将这个错误的依赖关系倒置
依赖倒置原则是JavaBean、EJB和COM等组件设计模型背后的基本原则
依赖倒置原则的应用
情景:显示生活中,司机只要会开车,就可以开奔驰车,也可以开宝马车。因此司机不依赖于奔驰车或者宝马车
//司机接口
public interface IDriver {
//司机都会驾驶汽车
public void drive(ICar car);
}
//司机类
public class Driver implements IDriver{
//司机的主要职责是驾驶
@Override
public void drive(ICar car) {
car.run();
}
}
//汽车接口
public interface ICar {
//汽车都能跑
public void run();
}
//
public class BMW implements ICar {
@Override
public void run() {
System.out.println("宝马汽车在行驶");
}
}
public class TestDIP {
public static void main(String[] args) {
IDriver tom = new Driver();
ICar car = new BMW();
tom.drive(car);
}
}
使用依赖倒置的注意事项:
- 每个类尽量都是具有接口或抽象类,或者抽象类和接口两者都具备。这是依赖倒置的基本要求,接口和抽象类都是抽象的,有了抽象才可能有依赖倒置
- 变量的表面类型尽量是接口或者是抽象类
- 任何类都不应该从具体类派生
- 尽量不要重写基类的方法。如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不需要重写。类之间依赖的是抽象,重写了非抽象方法,对依赖的稳定性会产生一定影响
- 结合里氏替换原则使用。