代码重构之策略模式

背景:订单系统越来越臃肿,随着需求的迭代,人员的变动,系统的维护成本越来越高了,正好有个需求是增加一种取消订单的方式,所以计划逐步开始重构代码。

查看原来的代码发现取消订单有很多种方式,原来的做法是通过if-else去做判断,这种做法的弊端很明显,每增加一种方式,都需要改动原有的代码,后边的分支会越来越多…策略模式是解决这个问题的好办法.话不多说,直接上代码.(业务代码略过) 1.先定义一个接口

public interface CancelOrderHandler {

    /**
     * 获取处理类型
     * @return
     */
    int getHandlerType();

    /**
     * 取消订单的处理
     */
    BizResponse<String> handler(OrderCancelDto dto);
}

复制代码

2.编写接口的实现类 用户取消订单实现

/**
 * 用户取消订单处理器
 */
@Service
@Slf4j
public class UserCancelOrderHandler implements CancelOrderHandler {
  
    /**
     * 获取处理类型
     *
     * @return
     */
    @Override
    public int getHandlerType() {
        return CancelOrderTypeEnum.USER.getType();
    }

    /**
     * 取消订单的处理
     */
    @Override
    public BizResponse<String> handler(OrderCancelDto dto) {
        log.info("用户取消订单...");
        //todo 业务代码
        return null;
    }
}

复制代码

系统取消订单实现

/**
 * 系统取消订单处理器
 */
@Service
@Slf4j
public class SystemCancelOrderHandler implements CancelOrderHandler {
  
    /**
     * 获取处理类型
     *
     * @return
     */
    @Override
    public int getHandlerType() {
        return CancelOrderTypeEnum.SYSTEM.getType();
    }

    /**
     * 取消订单的处理
     */
    @Override
    public BizResponse<String> handler(OrderCancelDto dto) {
        log.info("系统取消订单...");
        //todo 业务代码
        return null;
    }
}

复制代码

到这里接口和实现都定义好了,我们再定义一个策略类的工厂类。

/**
 * 取消订单的工厂类
 */
@Component
public class CancelHandlerFactory {
    
    @Autowired
    private List<CancelOrderHandler> handlerList;

    /**
     * 根据取消类型获取具体的实现
     * @param cancelType 取消订单类型
     * @return
     */
    public CancelOrderHandler getCancelHandler(Integer cancelType){
        return handlerList.stream().filter(handler -> handler.getHandlerType() == cancelType).findFirst().get();
    }

}

复制代码

这里有个小技巧

    @Autowired
    private List<CancelOrderHandler> handlerList; 
复制代码

这样写可以利用spring的注解 @Autowired 自动把接口的实现注入到list或者map里,后边再有新的取消订单方式,只需要写个新的实现类就OK了,是不是很方便,代码也很清晰!

猜你喜欢

转载自juejin.im/post/5e7c21f56fb9a009833586d1