策略模式优化if else

策略模式优化if else

Scroll Down

场景

根据传入实体类的订单属性,执行对应的逻辑。
例如:

 @PostMapping(value = "/OrderOperationOld")
    public Object OrderOperationOld(@RequestBody OrderReqDTO reqDTO) {
        if(OrderTypeEnum.ASSIGN.equals(reqDTO.getOrderType())){
            //执行订单 转派逻辑Service
        }else if(OrderTypeEnum.ERROR.equals(reqDTO.getOrderType())){
            //执行订单 异常逻辑Service
        }else if(OrderTypeEnum.POSTPONE.equals(reqDTO.getOrderType())){
            //执行订单 延期逻辑Service
        }else if(){
		......
	}
        return "{}";
    }

策略模式

controller

/**
     * 订单操作入口
     * 本订单可以是:
     *      异常订单
     *      转派订单
     *      延期订单
     *      等.... 
     * DTO:String orderType;BigDecimal money;
     * 根据传入实体类中的订单属性确认。
     * @param reqDTO
     * @return
     */
    @PostMapping(value = "/OrderOperationStrategy")
    public Object OrderOperationStrategy(@RequestBody OrderReqDTO reqDTO) {
        OrderStrategy.choose(reqDTO.getOrderType()).createOrder(reqDTO);//createOrder根据choose的service选择对应的实现类
        return "{}";
    }

策略类

public class OrderStrategy {

    private static Map<OrderTypeEnum, OrderService> SERVICE_MAP = new HashMap<>(16);

    //初始化,将service缓存到内存中
    static {
        Map<String, OrderService> map = SpringUtil.getBeansOfType(OrderService.class);
        for (Map.Entry<String, OrderService> entry : map.entrySet()) {
            SERVICE_MAP.put(entry.getValue().getType(), entry.getValue());
        }
    }

    /**
     * 根据订单类型选择对应的处理service
     * @param orderType
     * @return
     */
    public static OrderService choose(String orderType) {
        OrderTypeEnum type = OrderTypeEnum.of(orderType);
        return SERVICE_MAP.get(type);
    }
}

工具类

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    public static <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException {
        //获取容器中的属性
        return applicationContext.getBeansOfType(type);
    }
}