活动模块化编程方案

一、项目背景

随着活动业务越来越多,如何保证在未知的业务需求下,尽可能的去减少开发人员的工作,实现软件的快速迭代,可以从以下两点解决上述问题:
1.对于具有相似整体流程的多份代码,从流程上找出共同点,对其进行抽象。
2.将整个流程拆分成可复用的组件单元,通过对这些单元的聚合,组装起整个流程。从而也实现了代码最大复用性。

二、方案设计

模块化编程包含执行单元和组件单元,对于执行单元,预先定义好一类业务公共使用的组件单元(如需要校验最大限制次数的活动类),这些单元组件可组装可拆卸。各个业务线上,具有明确业务含义的操作移到业务自己的独立单元里面去。
执行单元:初始化操作,业务验证、业务执行、事后处理。
组件单元(细粒度划分);用户信息,排期信息,优惠券信息,红包信息,商品信息。
其具有三层逻辑:
第一层:将所有操作抽象成初始化操作,业务验证、业务执行、事后处理四步的顶层抽象;
第二层:对顶层抽象按照操作类型或业务类型进行分类,组装公共的单元组件。
第三层:不同业务通过定制化或者重写已有扩展点,来实现具有业务特性的功能。
最终整体如下图所述:

模块化编程.png

三、方案实现

模块化编程流程.png

四、方案实现

##顶级抽象:服务流程
 public interface ActivityService {

    default  ResponseDTO process(S context) {
        try {
            // 数据验证
            ResponseDTO result = check(context);
            if (!result.successed()) {
                return result;
            }
            // 数据执行
            return execute(context);
        } finally {
            // 事后处理
            return after(context);
        }
    }

    // 初始化操作
     void init(S context);

    // 校验处理
     ResponseDTO check(S context);

    //执行业务操作
     ResponseDTO execute(S context);

    //执行后操作
     ResponseDTO after(S context);
}
##二级抽象
public abstract class AbstractActivityService implements ActivityService {

    @Resource(name = "userCheckService")
    private UserCheckService userCheckService;

    @Resource(name = "scheduleCheckService")
    private ScheduleCheckService scheduleCheckService;

    /**
     * 初始化操作
     */
    @Override
    public  void init(S context) {
        // 预留给业务实现层的扩展点
        if (!isNfcInitInfo()){
            return;
        }
        //限流操作
        initNfcOperation(context);
    }

    /**
     * 限流操作
     * @param context
     * @param 
     */
    public  void initNfcOperation(S context){
        process(context);
        return;
    }

    protected abstract Boolean isNfcInitInfo();

    /**
     * 基础数据校验
     * @param context
     * @param 
     * @param 
     * @return
     */
    @Override
    public  ResponseDTO check(S context) {
        ResponseDTO responseDTO = userCheckService.isLogin(context.getUserId());
        if (!responseDTO.successed()){
            return responseDTO;
        }

        responseDTO = scheduleCheckService.checkActivityTime(context.getScheduleId());
        if (!responseDTO.successed()){
            return responseDTO;
        }

        // 预留给业务实现层的扩展点
        return businessBaseInfoCheck(context);
    }

    /**
     * 预留给业务实现层的扩展点
     */
    public abstract  ResponseDTO businessBaseInfoCheck(S context);

    /**
     * 数据处理
     */
    @Override
    public  ResponseDTO execute(S context) {

        return null;
    }

    /**
     * 事后处理
     */
    @Override
    public  ResponseDTO after(S context) {
        return null;
    }

}
##业务自定义服务
@Service("CpaActivitySignUpService")
public class CpaActivityServiceImpl extends AbstractActivityService implements CpaActivityService {


    @Override
    protected Boolean isNfcInitInfo() {
        return false;
    }

    @Override
    public  ResponseDTO businessBaseInfoCheck(S context) {
        return null;
    }


    @Override
    public void index() {
//        Long userId;
//        Long schedule =
    }
}

五、后续扩展

1.后续考虑做成配置化的方式形成业务规则,通过插拔某些组件形成新的规则。

你可能感兴趣的:(活动模块化编程方案)