背景:订单系统越来越臃肿,随着需求的迭代,人员的变动,系统的维护成本越来越高了,正好有个需求是增加一种取消订单的方式,所以计划逐步开始重构代码。
查看原来的代码发现取消订单有很多种方式,原来的做法是通过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了,是不是很方便,代码也很清晰!