关于依赖倒置原则的一次思考
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的属性和方法,以及声明与其他对象的依赖关系
-
抽象类负责公共构造部分的实现(将公共部分放到父类来实现)
-
-
依赖倒置原则
-
依赖的实现方式
-
构造函数传递依赖对象
-
Setter方法传递依赖对象
-
接口声明依赖对象——常用
-
-
倒置
-
什么是“倒置”
-
先说什么是“正置”
-
与“倒置”对立的就是“正置”了,其实“正置”就是我们生活中正常的顺序
-
比如:司机开车,必须是先有车,再有司机;而在程序中,我们按道理说也应该是,先有汽车类(Car),然后再有司机类(Driver),因此开发程序是,我们就需要先开发完成汽车类,然后才能开发司机类(因为司机类依赖了汽车类,汽车类的响应结果约束了司机的行为)
-
-
倒置的说的不是对象的倒置,而是“约束”的倒置
-
在当前的项目开发中,绝大多数都是团队协作,所以为了避免开发人员之间相互制约就需要将制约因素提前约定好,这样就可以各自完成各自的任务了。
-
比如:还是上面的例子,开发Driver对象时,需要依赖Car对象,为了避免因为Car对象没有开发完成,导致Driver对象无法开始,所以Driver对象依赖Car对象时,就需要形成一个约定(即约束),开发Driver对象的时候提供一个接口ICar,把需要Car对象提供什么服务都约定好了(接口参数和返回值),这样Car对象只需要实现接口就可以满足A对象的需求了。
-
-
总结
-
在依赖正置时,对象Car约束着对象Driver的行为
-
依赖倒置,对象Driver行为,约束着对象Car的行为
-
-
-
-
思维误区
-
在此之前,一直觉得接口都是由服务提供者来提供,但是通过此次研究依赖倒置原则,突然觉得,曾经以为正确的,反而蒙蔽了自己——接口应该由服务调用者来提供!或许这才是接口的真正意义所在吧
-
-
参考:
-
写在最后
-
这些都是在阅读《设计模式之禅》时,自己的一些思考,若有不妥的地方,还请指正
-
-
以上是关于关于依赖倒置原则的一次思考的主要内容,如果未能解决你的问题,请参考以下文章