定义
依赖倒置原则(Dependdency Inversion Principle)的设计原则是要依赖抽象,不要依赖具体类,即(1)不能让高层组件依赖低层组件,而高层组件和低层组件都应该依赖于抽象;(2)抽象不应该依赖细节,细节应该依赖抽象,其核心思想是:要面向接口编程,不要面向实现编程。
在软件设计中,细节(实现类)具有多变性,而抽象层(接口或者抽象类)则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构稳定很多。使用接口或者抽象类制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给他们的实现类完成。
依赖倒置原则主要作用有:
- 通过依赖接口和抽象类,降低类间的耦合性
- 接口和抽象类相对稳定,提交系统的稳定性
- 提高代码的可读性和可维护性
实现
依赖倒置原则的目的是通过要面向接口的编程降低类间的耦合性,开发过程中应遵循以下规则:
- 变量不持有具体类的引用,变量的声明类型尽量是接口或者抽象类
- 不要让类派生自具体类,如果派生自具体类,就会依赖具体类
- 不要覆盖基类中已实现的方法,基类中已实现的方法,应该由所有子类共享
设计方法:由自顶向下转为自下向上思考,看看底层是否可以抽象化些什么,高层依赖于抽象而不依赖具体的底层。
例如一家服装店卖上衣、裤子、帽子等等,服装店是顶层,而上衣、裤子、帽子是底层。
依赖倒置之前,自顶向下设计,服装店卖上衣、裤子、帽子等等,每卖一种类型商品,需要一个sell()方法。
public class ClothesShop {
// 卖上衣
public void sellJacket(Jacket jacket){
}
// 卖裤子
public void sellTrousers(Trousers trousers){
}
}
依赖倒置之后,由下向上设计,上衣、裤子、帽子都属于衣服品类,可以抽象出Clothes类,每个不同的衣服实现该类,ClothesShop只需要一个sell()方法
本来只有服装店向下依赖,而现在上衣、裤子、帽子也向上依赖衣服,高层向下依赖抽象层,底层也向上依赖抽象层。
public class ClothesShop {
// 卖各种衣服
public void sell(Clothes clothes){
}
}
class Clothes{
}