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;
}
}