概念描述
高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象
举例说明
每个村都有专门的邮递员,如果要寄信是需要把信自己送到邮递员家的。当时我父亲在南方打工,我母亲会经常让我把写给父亲的信送到邮递员李四家,一直持续了好几年。但是随着打工潮兴起,村里大量的年轻人都出门务工,李四也是其中之一。所以有一次我去寄信,李四家人告诉我李四已经不是邮递员了,现在新的邮递员是村里的王五,于是我需要重新跑到王五家。可是过了一阵子,王五也出门务工了,邮递员又换成了另外一个,我还得重新跑。我记得再过了一段时间,村里就没有邮递员了,而是在小卖部那里修了一个邮筒,寄信就扔邮筒里面,镇上的邮递员则会定期每隔几天来村里的邮筒取信。
这是一个很典型的依赖倒置原则的例子: 寄信这个活动,主要存在两种角色:寄信人和邮递员。 最开始寄信人强依赖于邮递员,寄信需要送到邮递员家。这种模式缺点比较明显,邮递员换了很麻烦。直到后面增加了邮筒,寄信人不再直接依赖邮递员,而是依赖一个站着不会动的邮筒。
上面的邮筒,可以让邮递员再怎么变化,都不会影响到寄信人。这种将寄信人直接依赖邮递员,改为寄信人和邮递员互不依赖,两者都依赖于邮筒的过程,正是“依赖倒置”。
作用
- 依赖倒置原则可以降低类间的耦合性。
- 依赖倒置原则可以提高系统的稳定性。
- 依赖倒置原则可以减少并行开发引起的风险。
- 依赖倒置原则可以提高代码的可读性和可维护性。
依赖倒置原则的实现方法
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。
- 每个类尽量提供接口或抽象类,或者两者都具备。
- 变量的声明类型尽量是接口或者是抽象类。
- 任何类都不应该从具体类派生。
- 使用继承时尽量遵循里氏替换原则。