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;
}
});
您也可以创建一个删除方法,然后您的折扣器可以变得更加复杂,引用外部数据等。您可能需要稍微开放一下界面并传递整个订单以进行更多检查。
注意:如果这是您要在生产中做的事情,我有两条主动建议:
考虑使用类似 JBoss Drools 的内容来处理你的业务逻辑而不是这个;它更加强大和灵活。
请不要使用
double
进行实际财务计算。 :)
关于java - 我该如何改进这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291248/