高层模块不应该依赖具体底层模块,两个都应该依赖接口。简单的说就是面向接口编程,而不是面向具体实现。任何变量都不应该持有一个具体指向类的指针或引用。
在实际编程中,我们一般需要做到:
- 低层模块尽量都要有抽象类或接口,或者两者都有。
- 变量的声明类型尽量是抽象类或接口。
- 使用继承时遵循里氏替换原则。
依赖倒置有三种方式来实现:
- 通过构造函数传递依赖对象;比如构造函数需要传递的参数是抽象类或接口
- 通过setter方法传递依赖对象;在我们设置的setXXX方法中的参数为抽象类或接口来实现传递依赖对象
- 接口声明实现依赖对象,接口注入;在函数声明中参数为抽象类或接口
依赖倒置原则的核心就是要面向接口编程,理解了面向接口编程,也就理解了依赖倒置。