名字很难理解,具体体现表现在三个方面
1:模块间的依赖通过抽象类发生,实现类之间不能发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
2:接口或抽象类不能依赖于实现类。
3:实现类依赖接口或者抽象类。
简而言之就表现为“面向接口编程”,OOD。
可以用都很熟悉的司机开车案例来理解
很多时候为了加快速度,都会这么写:
司机类,有一个方法是开车drive,需要一辆宝马车
String name;
public void drive(BaoMaCar mBaoMa){
mBaoMa.run();
}
}
宝马车,有一个方法是运行run。
public class BaoMaCar {
public void run(){
Log.e("fig","宝马开始行驶");
}
}
执行
public class Env {
public static void main(String[] args) {
Driver mDriver = new Driver();
mDriver.drive(new BaoMaCar());
}
}
结果就是宝马车开始行驶,这样开发速度很快,
但是很不利于后续程序的扩展,你想,如果有一天司机大叔又买了辆奔驰呢?是不是不光要创建一个奔驰车类,还要修改司机类的构造。新增开车的司机也会有这种麻烦。所以我们可以根据第一条原则----模块间的依赖通过抽象类发生,实现类之间不能发生直接的依赖关系,对代码进行重新设计,如下:新增两个接口,司机和车,如下:

司机的接口
public interface IDriver {
void drive(ICar mCar);
}
生产车的接口
public interface ICar {
void run();
}
运行时:
public class Env {
public static void main(String[] args) {
IDriver mDriver = new LiSiDriver();
mDriver.drive(new BaoMaCar());
mDriver.drive(new BenChiCar());
Log.e("fig","------------------------------");
IDriver mDriver2 = new ZhangSanDriver();
mDriver2.drive(new BenChiCar());
mDriver2.drive(new BaoMaCar());
}
}
运行结果如下:
这样就通过接口来实现了程序的可扩展性和易于维护性,遵循了依赖倒置原则,以后买了新车后只需实现ICar接口,就可以直接在Env中使用,而不必去修改司机类,同样,雇佣了新的司机只需实现IDriver接口,然后就可以在Env中直接使用,不会影响已经写过的代码。