1. 打折
    打折这种事情在电商是十分常见的,怎么将这个东西做成可以扩展,并且容易维护呢
  2. 先看结果:
    首先 劵有四个条件构成:
    促销范围,促销条件 条件参数 促销奖励
    促销范围有三种:老用户,新用户,老用户但是没有买过东西
    促销奖励:减免券 打折券…
 for (TPromotionMsg item : optionList) {
            // 根据优惠券规则去匹配对应的规则
            CalcFunction calcFunction = CalcFunctionRegister.getInstance(userType + item.getTicketType());
            resultData = calcFunction.calc(item, userCreditLimit);
  }

这里将 函数的类型存在 数据库中,因为每个用户都有自己的类型和tag ,所以这样也避免了写 if else if

  1. 总的枚举类 在枚举类内部写枚举类
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", "授信通过未提现的用户");
}

}
  1. 具体的函数实现类
@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());
    }
}
10-04 11:24