1、什么是依赖倒转原则?
所谓依赖倒置原则,就是不论高层组件和低层组件都应该依赖于抽象,而不是具体实现类。听起来更像是“针对接口编程,而不是针对实现编程”,但是这里依赖倒置原则更强调“抽象”的概念,不要让高层组件依赖低层组件,更不能依赖具体实现类,都要依赖于抽象。依赖倒置原则的核心在于“面向接口编程”,目的在于”解耦“。
2、这里的倒置是什么意思呢?
依赖倒置原则中的倒置是指我们的思想要和一般的“自顶向下”结构化设计思想相反。面向过程的设计方法是从顶端分析,然后到实现类,例如,简单工厂模式中我们让工厂生产产品,到是又不想让工厂和具体实现类存在任何关系,否则就对具体实现类产生了依赖,这是我们不希望看到的结果。这时候我们就应该将思想倒置一下,不要从顶端开始,我们从具体的实现类开始,看看能够抽象出什么,然后一切都依赖抽象来进行,这样就与我们的目标相近了。
3、为什么有依赖倒转原则?
在面向过程中,往往是高层组件调用低层组件,这样,高层组件就会依赖于低层组件,当低层组件发生剧烈变动时,高层组件也要跟着变动,就会倒置模块的复用性大大降低,并且大大提高开发成本,增加了软件扩展、维护的复杂度。如下为面向过程的软件开发调用图:
由图可以看出,高层组件调用低层组件,即高层组件依赖于低层组件,当低层组件发生变化时,势必会对高层组件产生影响。
那么我们应该怎样改变这种情况呢?应用依赖倒转原则可以解决这个问题,即面向接口编程。让我们的程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节之间的耦合度。面向接口示意图如下:
这样,无论低层组件怎样变化,只要抽象组件不发生变化,高层组件就不会发生变化,实现了客户程序与实现细节的解耦。
4、举例说明依赖倒置原则?
(1)不符合依赖倒转原则的类图
在这幅类图中,动物工厂(高层组件)生产猫和狗(猫狗具体类属于低层组件)时就要去调用猫和狗的构造方法,当我想增加生产鱼的功能时,就要增加鱼类,还要修改动物工厂类,这就违背了开闭原则。造成这种情况的原因就是因为动物工厂过于依赖具体动物类。
(2)符合依赖倒转原则的类图
在这幅类图中,动物工厂(高层组件)生产猫和狗(猫狗具体类属于低层组件)时依然需要调用猫和狗的构造方法,但这时候因为中间增加了抽象组件,我要增加生产鱼的功能的时候只要增加鱼类和鱼工厂就行了,而不需要去修改已有的类。这符合开闭原则,增加了程序的可扩展性和可维护性。
实现这一原则的设计模式典型的有工厂方法模式,在我的《设计模式之--工厂方法模式》 博客中已经做了很详细的概述。
小结:依赖倒置原则中的”倒置“说的是要和面向过程的思想倒置,用面向对象的思想去设计程序。值得注意的是,面向对象是一种思想,而不是说用了面向对象的编程语言,用类和对象写代码就是面向对象了,不要挂着”面向对象“的羊头,卖着”面向过程“的狗肉。只要开发程序,就要奔着将软件做成一个易扩展的、能够适应需求变化的软件,这是我们一直追求的。