我猜面试官是在暗示像责任链模式这样的东西对于这样的问题会有点过度设计。还有一个论点是您的实现类实际上将具有相同的责任,因为它们都将根据给定的输入计算一个数量,只是使用不同的参数。
我可能会用两个简单的类来做到这一点。可以根据输入值计算百分比费率,然后使用该费率返回费用金额。
如果您需要添加第四个条件,只需将其添加到包含速率计算的类中即可。对于这样一个简单的问题,我不明白为什么它需要比这更复杂。
编辑:
我的想法与@chrylis 相同,因为会有一个类通过处理有序的费率列表来执行计算。
class Rate {
int rangeSize;
double commission;
Rate(int rangeSize, double commission){
this.rangeSize = rangeSize;
this.commission = commission;
}
int computeForAmount(int amount) {
if (amount <= 0) {
return 0;
}
return (int) (Math.min(amount, this.rangeSize) * this.commission);
}
}
class FeeCalculator {
List<Rate> rates = Arrays.asList(
new Rate(100, 0.2),
new Rate(400, 0.1),
new Rate(500, 0.05));
int calculateCommission(int startingAmount) {
int commission = 0;
int remainingAmount = startingAmount;
for (Rate rate : this.rates) {
commission += rate.computeForAmount(remainingAmount);
remainingAmount -= rate.rangeSize;
}
return commission;
}
}
我承认我对通过调用打破封装并不完全满意,rate.rangeSize
但它确实展示了我试图表达的设计。