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

时间:2014-04-03 09:00:28

标签: oop design-principles

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

有什么区别?

2 个答案:

答案 0 :(得分: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();
    }
}

通过使用工厂方法模式或抽象工厂模式,您遵循两个原则。现在你正在编写一个抽象的编程,你完全依赖于抽象。披萨商店取决于两个抽象: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();
    }
}

所以是的,DI原则包括“程序到界面”原则。

答案 1 :(得分:-2)

在GoF Patterns一书中,您可以找到“interface”的定义。 对象操作定义的所有签名集称为对象的接口。 本书中的接口在.h文件中声明,并与实现分开。因此,给定原则是同义词。

不熟悉GoF Patterns一书的.NET开发人员可能会被.NET interfaces混淆。