引言
本文参考以下这篇文章
定义
从字面上讲,指的是高级模块不应该依赖低级模块(AutoSystem -> fordCar,bwmCar, benzCar),两者都应该依赖中间的抽象层
(AutoSystem -> ICar <- fordCar, bwmCar, benzCar)
个人总结
对于这种情况:(AutoSystem -> fordCar,bwmCar, benzCar)
如果新增其他类型的car,那么还要修改顶层的类AutoSystem,每次新增一个,都要修改AutoSystem,违背了开闭原则
修改后的情况:(AutoSystem -> ICar <- fordCar, bwmCar, benzCar)
如果新增其他类型的car,那么无需修改AutoSystem,大概率也不会修改ICar,因此这样的话,对项目的修改仅仅是新增文件
packagecom.yongzhi1u.接口隔离原则5.module;
// 顶层类 AutoSystem
publicclassAutoSystem {
privateICariCar;
AutoSystem (ICariCar) {
this.iCar=iCar;
}
publicvoidrunCar() {
iCar.run();
}
publicvoidturnCar() {
iCar.turn();
}
publicvoidstopCar() {
iCar.stop();
}
}
// 实现类 FordCar
packagecom.yongzhi1u.接口隔离原则5.module;
publicclassFordCarimplementsICar {
publicvoidrun() {
System.out.println("福特 run");
}
publicvoidturn() {
System.out.println("福特 turn");
}
publicvoidstop() {
System.out.println("福特 stop");
}
}
// 接口ICar
packagecom.yongzhi1u.接口隔离原则5.module;
publicinterfaceICar {
voidrun(); // 驾驶
voidturn(); // 转弯
voidstop(); // 停止
}
如果新增一个类型的车,只需要新建NewCar 实现ICar即可,其他文件无需修改
packagecom.yongzhi1u.接口隔离原则5.module;
publicclassNewCarimplementsICar {
publicvoidrun() {
System.out.println("new run");
}
publicvoidturn() {
System.out.println("new turn");
}
publicvoidstop() {
System.out.println("new stop");
}
}
对比
如果不使用依赖倒置原则:每次新增一种类型的Car,都会 新增一个文件(NewCar),修改一个文件(AutoSystem)
如果使用依赖倒置原则:每次新增一种类型的Car,只会新增一个文件(NewCar),可以看到这种方案可扩展性更强
2023.2.8 补充
今天刷到这篇文章
面向对象的三大基本特征,五大基本原则 - 风之之 - 博客园 (cnblogs.com)
看到了更加通俗易懂的解释:
如果一开始有两个类,鸡和鸭,我们可能抽象出一个草食动物的接口herbivore,并且给其添加 eat,fly方法,但是根据业务的扩展,我们又加入了羊和牛,同样也属于草食动物,那么这时我们又要修改这个草食动物接口herbivore,并且添加耕地gengdi的方法,并且牛羊也不需要实现fly方法,鸡鸭也不需要实现gengdi方法
上述描述可以发现,我们是从先有实现类 -> 再进行抽象接口 的方式来对进行设计的,这样设计出来的接口变动可能性更大,不利于维护;
如果我们从 先设计抽象接口 herbivore-> 再依次实现鸡鸭牛羊类 ,这样的话,如果还需要新增新的类大象,那么大概率herbivore这个接口是不会进行修改的
并且,在设计接口herbivore时,也可以同时设计出来
天上飞的 flyHerbivore extends herbivore
地上跑的 downHerbivore extends herbivore
然后分别让鸡鸭实现flyHerbivore,牛羊大象实现downHerbivore