2
public class DependentPizzaStore {
  public Pizza createPizza(String type) {
    Pizza pizza = null;
    if (Style.equals("NY")) {
      if (type.equals("cheese")) {
        pizza = new NYStyleCheesePizza();
      }
      else if(type.equals("Veggie")){
        pizza = new NYStyleVeggiePizza();
      }
    }

    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
  }
}

Headfirst Design Patterns 中的这个示例违反了“依赖倒置原则”,即“依赖于抽象。不依赖于具体类”。

上面的示例违反了规则,因为 DependentPizzaStore(高级组件)依赖于比萨饼(低级组件)的具体实现。

为了解决这个问题,我们使用工厂方法模式。

public abstract class PizzaStore {
  protected abstract Pizza createPizza(String item);
  public Pizza orderPizza(String type) {
    Pizza pizza = createPizza(type);
    System.out.println("--- Making a " + pizza.getName() + " ---");
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
  }

  public class NYPizzaStore extends PizzaStore {
    protected Pizza createPizza(String item) {
      Pizza pizza = null;
      if (item.equals("cheese")) {
        pizza = new CheesePizza();
      } else if (item.equals("veggie")) {
        pizza = new VeggiePizza();
      }
      return pizza;
    }   
  }

现在 PizzaStore(高级组件)仅依赖于 Pizza 具体类的 Pizza 抽象,并且具体 Pizzas 依赖于 Pizza 抽象,因为它们扩展了它。

我的问题是:NYPizzaStore 类是否也违反了“依赖倒置原则”,因为它依赖于 CheesePizza() 和 VeggiePizza(),它们是 Pizza 的具体实现。

4

1 回答 1

0

据我说,DIP 适用于您的主要程序部分。你不得不怀疑:

违反我的目标的代码在哪里?

在您的情况下,您的目标是允许创建披萨,同时遵循一些规则,而不依赖于您正在构建的披萨的知识。

因此,应将 DIP 应用于您的 PizzaStore 类。但是你用来实现这个目标的所有类,只是一些“插件”,因此,没有强制需要使用 DIP。

事实上,在所有类型的程序中,必须至少有一个位置用于包含具体类的简单 if/else 系列,否则您将永远无法获得成品。即使是最完美的代码也不可能是 100% 的“抽象”。

于 2012-04-29T22:18:20.320 回答