1

以下の方法に使用できる最も適切なパターンは何ですか。私は switch ステートメントの戦略パターンに傾いていますが、if はどうですか。また、異なるタイプの割引がある場合は、戦略パターンも使用する必要がありますか?

public void AddOrder(PaymentType paymentType, OrderType orderType)
{
    if (orderType == OrderType.Sale)
    {
        switch (paymentType)
        {
            case PaymentType.Cash:
                // Do cash calculations here
                break;
            case PaymentType.CreditCard:
                // Do credit card calculations here
                break;                    
        }
    }
    else if (orderType == OrderType.Refund)
    {
        switch (paymentType)
        {
            case PaymentType.Cash:
                // Do cash calculations here
                break;
            case PaymentType.CreditCard:
                // Do credit card calculations here
                break;
            }
        }            
    }

ありがとう

4

1 に答える 1

0

コードを見ると、基本的に必要なのは、PaymentTypeに2種類の注文を処理させることです。したがって、PaymentTypeを2つのメソッド(salesとrefund)を持つ抽象クラスとして実装する場合、戦略パターンの基礎があります。

次に、2つの具体的な種類のPaymentType(CashとCreditCard)を実装し、使用されている支払いの種類で適切なオブジェクトを構成します。

あなたの例では、私は本当に戦略はやり過ぎだと思います。ストラテジーは通常、グローバルデフォルトを構成するために使用されるため、これは不適切な適合である可能性もあります。ここでは、実際の具体的なタイプに関係なく、一連のトランザクションを処理できるようにしたいと考えているようです。

ここでは、コマンドパターンと組み合わせた単純なポリモーフィを使用する方がはるかに良いでしょう...

public interface Transaction {
  void perform();
}

public interface PaymentType {
  void sale();
  void refund();
}

public class Sale implements Transaction {
  private final PaymentType paymentType;

  public Sale(final PaymentType paymentType) {
    this.paymentType = paymentType;
  }

  public void perform() {
    paymentType.sale();
  }

}


public class Refund implements Transaction {
  private final PaymentType paymentType;

  public Refund(final PaymentType paymentType) {
    this.paymentType = paymentType;
  }

  public void perform() {
    paymentType.refund();
  }

}

今、あなたはすることができます:

public void AddOrder(final Transaction transaction) {
  transaction.perform();
}

これで、トランザクションが販売であるか払い戻しであるか、およびどの種類の支払いが使用されるかについての知識からAddOrderを切り離しました。これにより、新しい種類の取引(取り置き...)と新しい支払い方法(当座貸越)を簡単に追加できます。

于 2012-10-22T11:33:20.210 に答える