往常的代码
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);