依赖倒置原则(DIP)
- 高层模块不应该依赖于底层模块,二者都应该依赖于抽象
- 抽象不应该依赖于细节,细节应该依赖于抽象
高层模块是需要能重用的策略选择及业务模型,而如果高层模块依赖于低层,那么修改低层模块的时候会影响到高层模块,迫使它们也做出相应改变,那么这个高层模块也就做不到重用。因此得将高层模块所需要的服务声明抽象的接口,而低层模块则实现这些抽象接口,高层通过抽象接口使用低层,从而解除高层对低层的依赖。这就是著名的Hollywood原则:不要调用我们,我们会调用你。
找出潜在抽象
高层策略,它是应用背后的抽象,是系统内部的系统。
例如我们需要通过键盘输入文字到屏幕上显示出来,那么简单来写就是
void 输入输出()
{
获取键盘输入代码;
输出到屏幕代码;
}
但是这么写使得模块依赖于低层的输入和输出,导致代码无法复用。于是我们可以把代码给抽象出来。
void 输入输出()
{
调用输入接口;
调用输出接口;
}
输入和输出都抽象成接口,这样任何实现了输入接口的方法及实现了输出接口的方法都可以被输入输出使用。输入输出没有依赖于低层方法,只依赖抽象出来的接口,以此实现了依赖倒置。
细节和策略都依赖于抽象,对于创建可重用的框架来说是必须的,同时也使得代码富有弹性。而抽象和细节被彼此隔离,使得代码维护也会非常方便。