设计原则之依赖倒置原则

简述:

我们实际开发中都知道要面向接口编程,尽量减少实现类中的依赖,但是让你统一的完整用一个规则描述一下,你可能会一时语塞。
其实依赖倒置原则已经很好的阐述了相关的定义:

1.我们设计的高层模块不应该依赖低层模块,都应该依赖其抽象,实现类之间不应该有直接的依赖关系
2.抽象类不应该依赖于具体的细节,换句话说就是接口和抽象类不应该依赖于具体的实现类
3.细节应该依赖于抽象,实现类要依赖于接口或抽象类

用更简洁的话描述就是:面向接口编程
为什么要采用依赖倒置原则?先看个具体的例子

这张图可以看到,用户需要手机拨打电话,使用的是苹果手机(这里没用IPhone这个名字而是使用ApplePhone)
看上去也没什么问题,电话也能打通,但是有一天突然这个用户想换个手机了,想换个Android手机,那么上面的用户类就需要改变成AndroidPhone了,但是此时用户类和苹果手机已经紧密的耦合到一起了,可维护性很低。
如何解决?试想一下,我们正常开发的项目都是多人分工协作,倘若类似上述的负责用户类实现,那么它必须等将ApplePhone类完成,才方便进行开发,测试,那么此时面向接口编程就显得格外重要了。

此时抽象的用户依赖于抽象的手机模型,而具体的细节则由相应的实现类来实现。Client属于高层业务逻辑,它对低层的依赖都建立在抽象上,屏蔽了具体的实现细节对抽象的影响,测试驱动开发模式就是依赖倒置原则的最高级应用。

依赖的三种写法:

1.构造函数传递依赖对象
2.Setter方法传递依赖对象
3.接口声明的方式依赖对象

实践:

依赖倒置原则的本质就是通过抽象类或者接口使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。

小结:

关于依赖倒置原则我们应遵循:

1.每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备。 2.变量的表面类型尽量是接口或者抽象类 3.任何类都不应该都具体类派生 4.尽量不要重写基类的方法