第八章 依赖倒转原则(DIP)

依赖倒转说明要依赖抽象,不依赖具体。

一、什么是“倒转”
传统设计倾向于抽象层次依赖于具体层次。DIP则是把整个依赖关系倒转过来。

二、复用与可维护性的“倒转“
抽象层次较为稳定,应当是复用的重点。如果抽象层次的模块相对独立于具体层次的模块,那么抽象层次的模块复用相对比较容易。

三、DIP
1.三种耦合关系:

  • 零耦合关系
  • 具体耦合关系:由一个类对另一个类的直接引用造成
  • 抽象耦合:发生在一个具体类和一个抽象类(或Java接口)之间

2.针对接口编程的意思是应当使用Java接口和抽象Java类进行变量的类型声明、参量的类型声明、方法的类型声明,以及数据类型的类型转换等。

要保证做到这一点,一个具体的Java类应当只实现接口或抽象类中声明的方法,而不加多余的方法。

3.如果需要引用一个对象,如果这个对象有抽象类型,应当使用这个抽象类型作为变量的静态类型——针对接口编程。

使用抽象类型作为变量的类型,好处是在决定将一个具体类型转换为一个其他有同样接口(或抽象类)的类型时,改动少。使得程序有更好的灵活性。

只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括参量的类型声明、方法返还类型的声明、属性变量的类型声明等。

四、怎样做到DIP
以抽象方式耦合是DIP的关键。里氏替换原则(LSP)是DIP的基础。

在某些情况下,如果一个具体类方式变化的可能性非常小,那么抽象耦合发挥的好处有限,这时使用具体耦合反而更好。

五、Java对抽象类型的支持
Java接口和Java抽象类提供支持。

两者区别:

  • 只能继承一个抽象类,可以实现任意个Java接口
  • 代码重构角度看,Java具体类重构为Java接口容易,而添加一个Java抽象类不容易,因为该具体类可能已有一个超类,这样新定义的抽象类只能往上移动,成为超类的超类,如此循环。
  • Java接口提供Like-A关系,抽象类提供Is-A关系。

1.联合使用Java接口和Java抽象类


第八章 依赖倒转原则(DIP)_第1张图片

声明类型的工作仍然由Java接口承担,同时给出Java抽象类,为这个接口给出一个缺省的实现。其他同属于这个抽象类型的具体类可以选择实现Java接口或抽象类。这其实就是缺省适配模式。
在Java的API中也有用到,全都遵循一定命名规范:Abstract+接口名。例如,对于Collection,抽象类的名字是AbstractCollection。


第八章 依赖倒转原则(DIP)_第2张图片

六、DIP的优缺点
因为依赖倒转的缘故,对象的创建可能要使用对象工厂,以避免对具体类的之间引用,会导致大量的类。

你可能感兴趣的:(第八章 依赖倒转原则(DIP))