定义
DIP原则定义中核心的两句描述为如下两条:
- 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口(抽象)。
- 抽象接口(抽象)不应该依赖于具体实现。而具体实现则应该依赖于抽象接口(抽象)。
注:依赖倒置发生在层次结构的系统中。
三条原则
其他原则或者设计模式的解耦手段有很多,DIP的解耦手段就是确定不变,以不变应对需求的多变性,只有不变才是稳定的。
什么是不变?不变就是抽象。
- 代码中多用抽象接口,尽最大可能避免使用具体实现类,且实现类中要一直确定组合优于继承的方式。
- virtual在设计时就应该是一个没有任何逻辑的空函数。
- 在抽象设计时,应用
Open
这类名称代替如OpenInventory
含有具体实现细节的名称。
一个小示例
如上图所示的依赖关系,View依赖Manager,Manager依赖Plugin,Plugin依赖View。这种依赖关系有2个问题。
- 这种依赖迁移性(Transitivity)会造成View也依赖于Plugin
- 这是一种循环依赖,是设计上非常忌讳的事情。
为了打破这种迁移性和循环依赖,我们添加抽象接口IView
,让View和Manager都依赖于IView,这时View和Manager的关系就反转了或者说倒置了。
当然Plugin和View也可以用这种方式进行隔离。对于这种不稳定的依赖(View、数据库、插件等),我们都可以用抽象接口的方式将其隔离,对依赖方向进行反转。