依赖倒置原则(Dependence Inversion Principle)
依赖倒置原则的好处:
- 依赖倒置原则可以降低类间的耦合性。
- 依赖倒置原则可以提高系统的稳定性。
- 依赖倒置原则可以减少并行开发引起的风险。
- 依赖倒置原则可以提高代码的可读性和可维护性。
定义
- 高层模块不应该依赖低层模块, 两者都应该依赖其抽象;
- 抽象不应该依赖细节;
- 细节应该依赖抽象。
高层模块和低层模块容易理解, 每一个逻辑的实现都是由原子逻辑组成的, 不可分割的
原子逻辑就是低层模块, 原子逻辑的再组装就是高层模块。 那什么是抽象? 什么又是细节
呢? 在Java语言中, 抽象就是指接口或抽象类, 两者都是不能直接被实例化的; 细节就是实
现类, 实现接口或继承抽象类而产生的类就是细节, 其特点就是可以直接被实例化, 也就是
可以加上一个关键字new产生一个对象。 依赖倒置原则在Java语言中的表现就是:
- 模块间的依赖通过抽象发生, 实现类之间不发生直接的依赖关系, 其依赖关系是通过接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类。
依赖倒置原则的实现方法
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。
- 每个类尽量提供接口或抽象类,或者两者都具备。
这是依赖倒置的基本要求, 接口和抽象类都是属于抽象的, 有了抽象才可能依赖倒置。
- 变量的声明类型尽量是接口或者是抽象类。
很多书上说变量的类型一定要是接口或者是抽象类, 这个有点绝对化了, 比如一个工具
类, xxxUtils一般是不需要接口或是抽象类的。 还有, 如果你要使用类的clone方法, 就必须
使用实现类, 这个是JDK提供的一个规范。
- 任何类都不应该从具体类派生。
- 尽量不要覆写基类的方法。
如果基类是一个抽象类, 而且这个方法已经实现了, 子类尽量不要覆写。 类间依赖的是
抽象, 覆写了抽象方法, 对依赖的稳定性会产生一定的影响。
- 使用继承时尽量遵循里氏替换原则。