refatoração de código do padrão de estratégia

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!

Acho que você gosta

Origin juejin.im/post/5e7c21f56fb9a009833586d1
Recomendado
Clasificación