首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >购物车中的支付策略

购物车中的支付策略
EN

Stack Overflow用户
提问于 2012-06-24 15:58:13
回答 1查看 1.4K关注 0票数 1

对于下面的方法,最合适的模式是什么?我倾向于switch语句的策略模式,但是if如何呢?还有,如果我有不同类型的折扣,我也应该使用策略模式吗?

代码语言:javascript
复制
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;
            }
        }            
    }

谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-10-22 19:33:20

如果您查看您的代码,您基本上想要的是让PaymentType处理两种订单。因此,如果您将PaymentType实现为具有两个方法的抽象类-销售和退款-您就有了策略模式的基础。

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

对于你的例子,我真的认为这个策略有点过头了。它也可能是错误的,因为Strategy通常用于配置全局默认值。在这里,您似乎希望能够处理一组事务,而不考虑它们的实际具体类型。

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

代码语言:javascript
复制
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();
  }

}

现在您可以执行以下操作:

代码语言:javascript
复制
public void AddOrder(final Transaction transaction) {
  transaction.perform();
}

现在,您已经将AddOrder与任何关于交易是销售还是退款以及使用哪种支付方式的知识解耦。这使得添加一种新的事务(分期付款...)变得很容易。和新的支付方式(预付卡)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11175886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档