关于依赖倒置原则的一次思考

Posted 打杂工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于依赖倒置原则的一次思考相关的知识,希望对你有一定的参考价值。

  • 概念

    • High level modules should not depend upon low level modules;Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions;

    • 三层含义:

      • 高层模块不应该依赖底层模块,两者都应该依赖其抽象;

        • 底层模块:指的就是系统中的基础模块,换句话就是不可分割的原子模块

        • 高层模块:多个原子模块,组装成了高层模块。

      • 抽象不应该依赖细节;

      • 细节应该依赖抽象

    • 在Java中的表现形式——面向接口编程

      • 模块之间的依赖关系,都是通过抽象方式发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;

      • 接口或抽象类不依赖于实现类

      • 实现类依赖接口或抽象类

  • 接口和抽象类的作用

    • 接口负责定义public的属性和方法,以及声明与其他对象的依赖关系

    • 抽象类负责公共构造部分的实现(将公共部分放到父类来实现)

  • 依赖倒置原则

    • 依赖的实现方式

      1. 构造函数传递依赖对象

      2. Setter方法传递依赖对象

      3. 接口声明依赖对象——常用

    • 倒置

      • 什么是“倒置”

        1. 先说什么是“正置”

          1. 与“倒置”对立的就是“正置”了,其实“正置”就是我们生活中正常的顺序

          2. 比如:司机开车,必须是先有车,再有司机;而在程序中,我们按道理说也应该是,先有汽车类(Car),然后再有司机类(Driver),因此开发程序是,我们就需要先开发完成汽车类,然后才能开发司机类(因为司机类依赖了汽车类,汽车类的响应结果约束了司机的行为)

        2. 倒置的说的不是对象的倒置,而是“约束”的倒置

          1. 在当前的项目开发中,绝大多数都是团队协作,所以为了避免开发人员之间相互制约就需要将制约因素提前约定好,这样就可以各自完成各自的任务了。

          2. 比如:还是上面的例子,开发Driver对象时,需要依赖Car对象,为了避免因为Car对象没有开发完成,导致Driver对象无法开始,所以Driver对象依赖Car对象时,就需要形成一个约定(即约束),开发Driver对象的时候提供一个接口ICar,把需要Car对象提供什么服务都约定好了(接口参数和返回值),这样Car对象只需要实现接口就可以满足A对象的需求了。

        3. 总结

          1. 在依赖正置时,对象Car约束着对象Driver的行为

          2. 依赖倒置,对象Driver行为,约束着对象Car的行为

    • 思维误区

      1. 在此之前,一直觉得接口都是由服务提供者来提供,但是通过此次研究依赖倒置原则,突然觉得,曾经以为正确的,反而蒙蔽了自己——接口应该由服务调用者来提供!或许这才是接口的真正意义所在吧

    • 参考:

      1. https://www.jianshu.com/p/8d7723cd4e24

      2. https://q.cnblogs.com/q/72496/

    • 写在最后

      1. 这些都是在阅读《设计模式之禅》时,自己的一些思考,若有不妥的地方,还请指正

以上是关于关于依赖倒置原则的一次思考的主要内容,如果未能解决你的问题,请参考以下文章

Spring相关概念

依赖倒置原则

敏捷软件开发 – DIP 依赖倒置原则

六大设计原则DIP依赖倒置原则

依赖倒置原则(DIP)

设计模式学习之依赖倒置原则