Antecedentes: O sistema de ordem mais e mais inchado, junto com mudanças na iteração demanda, o pessoal, os custos de manutenção do sistema ficando mais e mais, só para ter uma maneira de aumentar a demanda é para cancelar a ordem, que planeja começar a gradualmente código de reconstrução.
Ver o código original encontrado há muitas maneiras de cancelar a ordem, a prática original é feita através da determinação if-else, as desvantagens desta abordagem é óbvia, em cada sentido um adicional, você precisa alterar o código original, o ramo estará de volta mais e mais ... modo de estratégia é uma boa maneira de resolver este problema. homem de poucas palavras, disse, diretamente na (salto código de negócios) de código 1. definir uma interface
public interface CancelOrderHandler {
/**
* 获取处理类型
* @return
*/
int getHandlerType();
/**
* 取消订单的处理
*/
BizResponse<String> handler(OrderCancelDto dto);
}
复制代码
2. Escreva uma classe que implementa a interface de usuário cancela o atendimento de pedidos
/**
* 用户取消订单处理器
*/
@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;
}
}
复制代码
Anular o sistema de atendimento de pedidos
/**
* 系统取消订单处理器
*/
@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;
}
}
复制代码
Aqui, a interface e implementação são definidos, que, em seguida, definir uma política de classe classe de fábrica.
/**
* 取消订单的工厂类
*/
@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();
}
}
复制代码
Aqui vai uma dica
@Autowired
private List<CancelOrderHandler> handlerList;
复制代码
Então você pode escrever notas usando a implementação da interface primavera @Autowired injetado automaticamente na lista ou mapa, a parte traseira e, então, uma nova maneira de cancelar a encomenda, basta escrever uma nova classe de implementação é OK, não é muito conveniente, o código também é muito claro!