重构 switch 使用 工厂+策略

往常的代码

       switch (zeroOrderRequest.getReceiveType()){
            case 11: 
            	return receiveOrder(zeroOrderRequest, orderZeroLoadModel, orderZeroLoadModelTemp);
            case 12: 
            	return auditPassOrder(zeroOrderRequest, orderZeroLoadModel, orderZeroLoadModelTemp);
            case 13: 
            	return auditRefuseOrder(zeroOrderRequest, orderZeroLoadModel, orderZeroLoadModelTemp);
            default:return 
            	R.error("valid receiveType");
        }

听架构师说这样的代码 一点不优雅 重构为 一个工厂 + 枚举 + 策略实现

创建一个 工厂


/**
 * 伯乐操作运单工厂
 */
@Component
public class OperationOrderFactory {
	
	
	#动态注入 实现这个service 的
    @Autowired
    List<OperationOrderService> operationOrderServiceList;

    private Map<Integer, OperationOrderService> handleMap = new HashMap<>();

	# 初始化
    @PostConstruct
    public void init() {
        if (CollectionUtils.isNotEmpty(operationOrderServiceList)) {
            operationOrderServiceList.forEach(operationOrderService -> {
                handleMap.put(operationOrderService.getType().getCode(), operationOrderService);
            });
        }
    }

    public OperationOrderService getInstance(Integer disType) {
        if (!handleMap.containsKey(disType)) {
            return handleMap.get(OperationOrderEnum.ERROR_REQUEST.getCode());
        }
        return handleMap.get(disType);
    }
}

创建一个service


/**
 * dongzhiwei
 * 操作订单服务 用来策略模式
 */
public interface OperationOrderService {
    /**
     * 操作 运单方法
     * @param zeroOrderRequest
     * @param orderZeroLoadModel
     * @param orderZeroLoadModelTemp
     * @return
     */
    R OperationOrderMethod(ZeroOrderRequest zeroOrderRequest, OrderZeroLoadModel orderZeroLoadModel, OrderZeroLoadModel orderZeroLoadModelTemp);

    /**
     * 获取用来确认不同 实现的方法
     * @return
     */
    OperationOrderEnum getType();

}

然后几个实现这个服务 就可以了


/**
 *  14 应付改单审单通过
 */
@Component
@Slf4j
public class ApplyPassOrderImpl implements OperationOrderService {

    @Resource
    FengYuService fengYuService;

    @Resource
    FyConfig fyConfig;

    @Override
    public R OperationOrderMethod(ZeroOrderRequest zeroOrderRequest, OrderZeroLoadModel orderZeroLoadModel, OrderZeroLoadModel orderZeroLoadModelTemp) {
        log.info("订单号{},申请应付改单申请通过",zeroOrderRequest.getZeroLoadOrderNumber());
        return fengYuService.postJson(fyConfig.getApplyZeroLoadPassUrl(), JSONUtil.toJsonStr(zeroOrderRequest));
    }

    @Override
    public OperationOrderEnum getType() {
        return OperationOrderEnum.APPLY_PASS_ORDER;
    }
}

/**
 * 15 应付改单审单拒绝
 */
@Component
@Slf4j
public class ApplyRefuseOrderImpl implements OperationOrderService {

    @Resource
    OrderZeroLoadDao orderZeroLoadDao;

    @Override
    public R OperationOrderMethod(ZeroOrderRequest zeroOrderRequest, OrderZeroLoadModel orderZeroLoadModel, OrderZeroLoadModel orderZeroLoadModelTemp) {
        log.info("审单拒绝,订单号{}",zeroOrderRequest.getZeroLoadOrderNumber());
        orderZeroLoadDao.updateApplyStateByOrderNumber(zeroOrderRequest);
        return R.ok();
    }

    @Override
    public OperationOrderEnum getType() {
        return OperationOrderEnum.APPLY_REFUSE_ORDER;
    }
}

调用就可以了

        R r = operationOrderFactory.getInstance(zeroOrderRequest.getReceiveType()).OperationOrderMethod(zeroOrderRequest, orderZeroLoadModel, orderZeroLoadModelTemp);

猜你喜欢

转载自blog.csdn.net/hgdzw/article/details/106161551