Oop 区别于;依赖抽象而不是具体的类”;及;编程到一个接口“;
我不清楚这两个原则之间的区别。它们看起来是一样的Oop 区别于;依赖抽象而不是具体的类”;及;编程到一个接口“;,oop,design-principles,Oop,Design Principles,我不清楚这两个原则之间的区别。它们看起来是一样的 如果有的话,有什么区别?与《头先设计模式》一书第139页中关于“依赖倒置”原则的内容不同: 依赖倒置原则:依赖于抽象。不要依赖于具体的类别 起初,这个原则听起来很像“编程到接口,而不是实现”,对吗?这是相似的;然而,依赖倒置原则对抽象做出了更有力的陈述。它表明,我们的高水平组成部分不应依赖于我们的低水平组成部分;相反,它们都应该依赖于抽象 “高级”组件是一个类,其行为是根据其他“低级”组件定义的。例如,PizzaStore是一个高级组件,因为它的
如果有的话,有什么区别?与《头先设计模式》一书第139页中关于“依赖倒置”原则的内容不同: 依赖倒置原则:依赖于抽象。不要依赖于具体的类别 起初,这个原则听起来很像“编程到接口,而不是实现”,对吗?这是相似的;然而,依赖倒置原则对抽象做出了更有力的陈述。它表明,我们的高水平组成部分不应依赖于我们的低水平组成部分;相反,它们都应该依赖于抽象 “高级”组件是一个类,其行为是根据其他“低级”组件定义的。例如,
PizzaStore
是一个高级组件,因为它的行为是根据pizzas定义的-它创建所有不同的pizza对象,准备、烘焙、切割和包装它们,而它使用的pizzas是低级组件
下面的代码遵循“编程到接口,而不是实现”的原则,因为您正在对抽象调用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();
}
}
通过使用工厂方法模式或抽象工厂模式,您可以同时遵循这两个原则。现在,您正在针对抽象进行编程,并且您完全依赖于抽象。比萨饼店依赖于两种抽象: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();
}
}
是的,DI原则包括“程序到接口”原则。在GoF模式书中,你可以找到“接口”的定义对象操作定义的所有签名集称为对象的接口。本书中的接口是在.h文件中声明的,并与实现分离。因此,给定的原则是同义的
不熟悉GoF模式书的.NET开发人员可能会被这本书弄糊涂。好吧,这本书正好引出了这个问题,因为它介绍了这两个不同的原则,但解释对我来说是不够的。我最多只能看到一个界面的
程序
已经包含在依赖抽象中,我认为抽象就是用不同的词来表达争取松散耦合。@LeNoob我已经更新了我的帖子,希望现在更清楚。我同意你的观点,DI原则包括对接口进行编程。