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 (高レベル コンポーネント) がピザ (低レベル コンポーネント) の具体的な実装に依存しているため、規則に違反しています。

これを修正するために、Factory Method パターンを使用します。

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 抽象化のみに依存しており、具象 Pizza もピザの抽象化を拡張しているため、Pizza 抽象化に依存しています。

私の質問は: NYPizzaStore クラスは、Pizza の具体的な実装である CheesePizza() と VeggiePizza() に依存しているため、「依存性反転原則」にも違反していますか。

4

1 に答える 1

0

私によると、DIP はメイン プログラム部分に適用できます。あなたは疑問に思う必要があります:

私の目標を達成するコードはどこにありますか?

あなたの場合、あなたの目的は、いくつかのルールに従って、作成しているピザの知識に依存せずに、ピザを作成できるようにすることです。

したがって、DIP を PizzaStore クラスに適用する必要があります。しかし、この目標を達成するために使用するすべてのクラスは、単にある種の「プラグイン」であるため、DIP を使用する義務はありません。

実際、すべてのタイプのプログラムの中で、具体的なクラスを含む単純な一連の if/else のための場所が少なくとも 1 つは必要です。どんなに完璧なコードであっても、100%「抽象的」にはなりません。

于 2012-04-29T22:18:20.320 に答える