从头部第一设计模式,第139页,关于"依赖性倒置"原则:
依赖性倒置原则:取决于抽象.不要依赖具体的课程.
起初,这个原理听起来很像"程序到界面,而不是实现",对吧?它是相似的; 然而,依赖倒置原则对抽象做出了更为强烈的陈述.它表明我们的高级组件不应该依赖于我们的低级组件; 相反,他们应该都依赖于抽象.
"高级"组件是具有根据其他"低级"组件定义的行为的类.例如,它
PizzaStore是一个高级组件,因为它的行为是根据比萨定义的 - 它创建了所有不同的披萨对象,准备,烘焙,切割和装箱,而它使用的披萨是低级组件.
以下代码遵循"程序到接口,而不是实现"原则,因为您正在调用Bake并Deliver在抽象上.但它并没有跟随DI原则,因为你的代码的第一个块仍取决于一些具体的Pizza类型.
public class PizzaStore
{
public void OrderPizza(PizzaType type)
{
Pizza pizza;
switch(type)
{
case PizzaType.FourSeasons:
pizza = new FourSeasonsPizza();
//...
}
//do something with pizza
pizza.Bake();
pizza.Deliver();
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用工厂方法模式或抽象工厂模式,您遵循这两个原则.现在你正在编写一个抽象编程,而你完全依赖于抽象.披萨商店取决于两个抽象:Pizza和PizzaFactory.
public class PizzaStore
{
private PizzaFactory factory;
public PizzaStore(PizzaFactory factory)
{
this.factory = factory;
}
public void OrderPizza(PizzaType type)
{
Pizza pizza = factory.CreatePizza(type);
//do something with pizza
pizza.Bake();
pizza.Deliver();
}
}
Run Code Online (Sandbox Code Playgroud)
所以,是的,DI原则包括"程序到界面"原则.