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 处理两种订单。因此,如果您将 PaymentType 实现为具有两种方法(销售和退款)的抽象类,您就有了策略模式的基础。

然后,您将实现两种具体类型的 PaymentType(Cash 和 CreditCard),然后使用正在使用的支付类型配置一个合适的对象。

对于你的例子,我真的认为战略是矫枉过正的。它也可能不合适,因为 Strategy 通常用于配置全局默认值。在这里,您似乎希望能够处理一堆事务,而不管它们的实际具体类型如何。

在这里使用简单的多态与命令模式相结合可能会好得多,例如...

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 与交易是销售还是退款以及使用哪种付款方式的任何知识分离。这使得添加一种新的交易(layaway...)和新的支付方式(debet 卡)变得容易。

于 2012-10-22T11:33:20.210 回答