我有一个计费系统,其中不同类型的客户具有不同类型的折扣方案。对于给定的帐单,应根据客户和产品的类型生成应付帐款净额。
而且也没有什么规则。喜欢 :
•如果用户是商店的员工,则可获得30%的折扣
•如果用户是商店的会员,则可获得10%的折扣
•如果用户已成为客户2年以上,则可享受5%的折扣。
•账单上的每100美元,将有5美元的折扣(例如,对于990美元,您将获得45美元的折扣)。
•基于百分比的折扣不适用于杂货...
我脑子里没什么主意。第一个选择是考虑一个装饰器模式:
Customer <<Interface>>
|
CustomerImpl
DiscountDecorator <<AbstractClass>> imp Customer
| | | |
AffiDiscount StoreEmp OverTwoYears AnyOtherDisc
Discount Discount Discount
Items {
//? ? :/
}
但是,那Discounts
也要依赖于Items
。
我有什么选择?
Customer
用Item
接口扩展接口以跟踪项目类型?List
的Items
对折类。...如何与Customer
和Item
类正确关联,以便可以将它们一起装饰?我还看不到需要某种模式,也许只是做这样的事情:
import java.util.EnumSet;
public class So35680415 {
enum Discount {
employee {
@Override double discount(double amount) {
return amount*.30;
};
},
affiliate {
@Override double discount(double amount) {
// TODO Auto-generated method stub
return amount*.10;
};
},
customerForTwoYears {
@Override double discount(double amount) {
return Math.floor(amount/100)*100*.05;
};
};
abstract double discount(double amount);
}
static class User {
void discounts(double amount) {
for(Discount discount:discounts)
System.out.println("discount for: "+discount+" on: $"+amount+" is: $"+discount.discount(amount));
}
EnumSet<Discount> discounts=EnumSet.noneOf(Discount.class);
}
public static void main(String[] args) {
User user=new User();
user.discounts.add(Discount.employee);
user.discounts(100);
System.out.println("---");
user.discounts.add(Discount.affiliate);
user.discounts(100);
System.out.println("---");
user.discounts.add(Discount.customerForTwoYears);
user.discounts(100);
System.out.println("---");
}
}
编辑回答问题:它似乎没有违反srp,因为它做一件事即计算折扣。枚举似乎是完成任务的理想选择。枚举的类型是子类。添加另一个枚举很容易。它确实看起来像策略模式
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句