java - 我该如何改进这段代码?

标签 java design-patterns

public class OrderProcessor {

  public Double calculateTotalPriceWithDiscountCode(Order order,
        char discountCode) {

    Double itemTotal = order.getItemTotal();
    Double discountAmount = 0.0;

    switch (discountCode) {
    case 'A':
        discountAmount = 0.95 * itemTotal;
        break;
    case 'B':
        discountAmount = 0.15 * itemTotal;
        break;
    }
    return itemTotal - discountAmount;
}

订单处理器中的当前实现已关闭以进行扩展,并开放以进行修改以添加新的折扣代码,我如何改进设计以摆脱此限制

最佳答案

一般来说,switch 的存在很好地揭示了什么应该是一个类。因此,第一次尝试会是这样的:

public interface Discounter {
  public double applyDiscount(double itemTotal);
}

public class OrderProcessor {
  private Map<Char, Discounter> discounts = new HashMap<Char, Discounter>();

  public void addDiscounter(Char discountCode, Discounter discounter) {
    discounts.put(discountCode, discounter);
  }

  public Double calculateTotalPriceWithDiscountCode(Order order, char discountCode) {
    double itemTotal = order.getItemTotal();
    double discountAmount = 0.0;

    if (discounts.hasKey(discountCode))
      discountAmount = discounter.applyDiscount(itemTotal);

    return itemTotal - discountAmount;
  }
}

然后可以通过这样的方式扩展:

processor.addDiscounter('A', new Discounter() {
  public double applyDiscount(double itemTotal) {
    return 0.95 * itemTotal;
  }
});

您也可以创建一个删除方法,然后您的折扣器可以变得更加复杂,引用外部数据等。您可能需要稍微开放一下界面并传递整个订单以进行更多检查。

注意:如果这是您要在生产中做的事情,我有两条主动建议:

  1. 考虑使用类似 JBoss Drools 的内容来处理你的业务逻辑而不是这个;它更加强大和灵活。

  2. 请不要使用double进行实际财务计算。 :)

关于java - 我该如何改进这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291248/

相关文章:

java - 在main中调用方法

java - jstack正常工作两周后失败

java - Azure Java SDK - Azure 身份验证对象 - 过期和处理

java - 获取组合框中选定项目的文本

java - 是否存在将 Java 对象序列化为 JSON 的模式?

android - 委派经理是一个好的设计理念吗?

java - 我应该声明字段 volatile 吗?

java - 使空对象不可变的任何标准模式或策略

java - 避免多个 Singleton 实例?

c# - 单独实现编程设计