实现“开闭”原则的关键是抽象化,并且从抽象化导出具体化实现。如果说开闭原则是面向对象设计的目标的话,依赖倒转原则就是这个面向对象设计的主要机制。

    依赖倒转原则讲的是:要依赖于抽象,不要依赖于具体。

为何而“倒转”

    为什么要使用“倒转(Inversion)”一词,依赖倒转(Dependence Inversion)的意义是什么?

    简单地说,传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块:抽象层次依赖于具体层次。倒转原则是要把这个错误的依赖关系倒转过来,这就是“依赖倒转原则”的来由。

    抽象层次依赖于具体层次的含义是什么呢?抽象层次包含的是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现:而具体层次则含有一些次要的于实现有关的算法和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是会经常有变动的,不能避免出现错误。抽象层次依赖于具体层次,使许多具体层次的细节的算法变化立即影响到抽象层次的宏观的商务逻辑,到值微观决定宏观,战术决定战略,偶然决定必然。如下图所示,这难道不是很荒唐的吗?

    抽象层次含有宏观的和重要的商务逻辑,难道不应当由它决定具体层次的实现和具体算法的改变吗?抽象层次含有战略的决策,难道不应当由它来决定具体层次的战术的决策吗?抽象层次含有必然性的选择,难道不应当由它来知道具体层次的偶然性选择吗?

    抽象层次依赖于具体层次显然是不对的。依赖倒转原则就是要把错误的依赖关系再倒转过来,如下图所示:

    依赖倒转原则是COM、CORBA、JavaBean以及EJB等构建设计模型背后的基本原则。