每天一学设计模式(六、依赖倒置原则)

引言


本文参考以下这篇文章

依赖倒置原则_百度百科 (baidu.com)

解释依赖倒置原则。 - 百度文库 (baidu.com)

定义


从字面上讲,指的是高级模块不应该依赖低级模块(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值