"取决于抽象而非具体类"和"程序到界面"之间的区别

dev*_*ull 9 oop design-principles

这两个原则之间的区别对我来说并不清楚.它们看起来像是一样的东西.

有什么区别?

dca*_*tro 5

从头部第一设计模式,第139页,关于"依赖性倒置"原则:

依赖性倒置原则:取决于抽象.不要依赖具体的课程.

起初,这个原理听起来很像"程序到界面,而不是实现",对吧?它是相似的; 然而,依赖倒置原则对抽象做出了更为强烈的陈述.它表明我们的高级组件不应该依赖于我们的低级组件; 相反,他们应该依赖于抽象.

"高级"组件是具有根据其他"低级"组件定义的行为的类.例如,它PizzaStore是一个高级组件,因为它的行为是根据比萨定义的 - 它创建了所有不同的披萨对象,准备,烘焙,切割和装箱,而它使用的披萨是低级组件.

以下代码遵循"程序到接口,而不是实现"原则,因为您正在调用BakeDeliver在抽象上.但它并没有跟随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)

通过使用工厂方法模式或抽象工厂模式,您遵循这两个原则.现在你正在编写一个抽象编程,你完全依赖于抽象.披萨商店取决于两个抽象:PizzaPizzaFactory.

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原则包括"程序到界面"原则.