1
resposta

Desta forma se enquadraria no pattern Chain of Responsibility ?

Gostaria de saber se da forma que implementei se enquadraria no pattern Chain of Responsibility? Visto que como uso uma lista e adiciono na ordem os descontos seriam aplicados na ordem e somente 1 seria aplicado, no caso o primeiro que retornasse valor

Criei uma interface Desconto

public interface Desconto {
    BigDecimal calcular(Orcamento orcamento);
}

as implementações

public class DescontoOrcamentoMaiorQuinhentos implements Desconto {

    public BigDecimal calcular(Orcamento orcamento) {
        if(orcamento.getValor().compareTo(new BigDecimal("500")) > 0) {
            return orcamento.getValor().multiply(new BigDecimal("0.05"));
        }
        return BigDecimal.ZERO;
    }
}
public class DescontoOrcamentoQuantidadeMaiorCinco implements Desconto {

    public BigDecimal calcular(Orcamento orcamento) {
        if(orcamento.getQuantidadeItens() > 6) {
            return orcamento.getValor().multiply(new BigDecimal("0.1"));
        }
        return BigDecimal.ZERO;
    }
}

E a classe calculadora. Conforme novos descontos surgissem bastava implementar e adicionar na lista conforme a ordem a ser aplicada. Sei que a lista de descontos poderiam vir como dependência mas deixei dessa forma para ficar mais claro a forma que fiz

public class CalculadoraDescontos {

    private List<Desconto> descontos = List.of(
            new DescontoOrcamentoQuantidadeMaiorCinco(), 
            new DescontoOrcamentoMaiorQuinhentos()
        );

    public BigDecimal calcular(Orcamento orcamento) {

        for (Desconto desconto : descontos) {
            BigDecimal descontoCalculado = desconto.calcular(orcamento);
            if(BigDecimal.ZERO.equals(descontoCalculado)) {
                continue;
            }
            return descontoCalculado;
        }

        return BigDecimal.ZERO;
    }
}
1 resposta

Oi Gustavo,

Pior que dessa forma não se enquadaria, pois na sua implementação não existe o "encadeamento" entre os descontos, no qual um vai chamando o outro, que é justamente a ideia desse padrão.

Bons estudos!