- 打折
打折这种事情在电商是十分常见的,怎么将这个东西做成可以扩展,并且容易维护呢 - 先看结果:
首先 劵有四个条件构成:
促销范围,促销条件 条件参数 促销奖励
促销范围有三种:老用户,新用户,老用户但是没有买过东西
促销奖励:减免券 打折券…
…
for (TPromotionMsg item : optionList) {
// 根据优惠券规则去匹配对应的规则
CalcFunction calcFunction = CalcFunctionRegister.getInstance(userType + item.getTicketType());
resultData = calcFunction.calc(item, userCreditLimit);
}
这里将 函数的类型存在 数据库中,因为每个用户都有自己的类型和tag ,所以这样也避免了写 if else if
- 总的枚举类 在枚举类内部写枚举类
public enum FuncTypeEnum implements IUnexEnum<FuncTypeEnum> {
PROMO_SCOPE("01", "促销范围"), PROMO_CONDITION("02", "促销条件"),
PROMO_CONDITION_PARAM("03", "条件参数"), PROMO_INCENTIVE("04", "促销奖励");
private final String code;
private final String desc;
public enum PromoConditionEnum implements IUnexEnum<PromoConditionEnum> {
NON("0", "无"), FULL_DISCOUNT("04", "减免券"), ACCRUAL_DISCOUNT("08", "利息打折券");
PromoConditionEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
}
public enum PromoScopeEnum implements IUnexEnum<PromoScopeEnum> {
NEW_USER("01", "新用户"), GREAT_USER("02", "优质老用户"), ORDER_USER("03", "授信通过未提现的用户");
}
}
- 具体的函数实现类
@Component
public class CalcFunction0101 implements CalcFunction{
public static final String FUNCTION_TYPE = FuncTypeEnum.PROMO_SCOPE.code();
public static final String FUNCTION_CODE = FuncTypeEnum.PromoScopeEnum.ITEM.code();
static{
// 注册当前原子函数方法
CalcFunctionRegister.register(FUNCTION_TYPE + FUNCTION_CODE, new CalcFunction0101());
}
/**
* 构造函数私有化,不允许自己生成该对象
*/
private CalcFunction0101(){
}
@Override
public CalcResult calc(ICalcPromoObject promoObject{
}
/**
* 原子函数注册管理器
*/
public abstract class CalcFunctionRegister{
public static Map<String, CalcFunction> funcMap = new HashMap<String, CalcFunction>();
/**
* 原子函数注册
*
* @param functionCode
* 函数编码
* @param function
* 原子函数计算实例
*/
public static void register(String functionCode,CalcFunction function){
if (funcMap.containsKey(functionCode)){
throw new UnexBaseException("CalcFunction \"" + functionCode + "\" already registered.");
}
funcMap.put(functionCode, function);
}
/**
* 根据函数编码获取原子函数计算实例
*
* @param functionCode
* 函数编码
* @return 原子函数计算实例
*/
public static CalcFunction getInstance(String functionCode){
return funcMap.get(functionCode);
}
/**
* 根据函数模板对象获取原子函数计算实例
*
* @param templetFunc
* 函数模板对象
* @return 原子函数计算实例
*/
public static CalcFunction getInstance(CalcTempletFunc templetFunc){
if (null == templetFunc){
return null;
}
return funcMap.get(templetFunc.getFunctionType() + templetFunc.getFunctionCode());
}
}