请注意,DI 是遵循 DIP 原则的一种方式。
理解“反转”概念的一个简单示例是采用静态语言,例如 Java。
如果没有应用 DIP,您将拥有:
public class CarStarter {
public start() {
new Ferrari().start();
}
}
在这里,如果我们想改变Ferrari
by ,我们将不得不打破类Porsche
。我们说“CarStarter”依赖于一个低级项目:Ferrari
.
所以 DIP 倾向于:“我不想CarStarter
依赖于汽车的具体性质,我希望汽车依赖于CarStarter
!”
那么在这种情况下,满足此要求的简单解决方案是什么?
=> 使 CarStarter 依赖于接口 ( Car
) 而不是具体元素。
CarStarter
需要接口,所以Ferrari
必须实现它。这就是我们谈论“倒置”的原因:
之前,Ferrari
“自由”没有任何要实施的规则。
但现在Ferrari
预计会遵循一些规则,在这种情况下“实现Car
接口”。
这样,您就CarStarter
不会意识到它使用的具体类:
public class CarStarter {
public start(Car car) {
car.start();
}
}
请注意,这种做法确实简化了CarStarter
类的测试,因为您可以存根/模拟Car
.
编辑 - - - -
这是鲍勃叔叔(DIP原理的作者)的摘录:
有人可能会质疑我为什么使用“反转”这个词。坦率地说,这是因为更传统的软件开发方法,例如结构化分析和设计,倾向于创建高级模块依赖于低级模块,抽象依赖于细节的软件结构。实际上,这些方法的目标之一是定义描述高级模块如何调用低级模块的子程序层次结构。图 1 是这种层次结构的一个很好的例子。因此,设计良好的面向对象程序的依赖结构相对于通常由传统过程方法产生的依赖结构是“倒置的”。
因此,总结一下:
倒置一词源于 DIP 原则旨在“倒置”开发人员的习惯:
抽象不应该依赖于细节。
细节应该取决于抽象。