1
resposta

Uma segunda alternativa

Eu entendo que a proposta do curso é mostrar esses os modelos, mas me surgiu uma ideia de fazer um pouco diferente e gostaria de saber se é viável executar minha solução no mundo real, a classe Calculadora ficaria mais ou menos assim:

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

    private List<Desconto> descontosPossiveis;

    public CalculadoraDeDesconto(List<Desconto> descontosPossiveis) {
        this.descontosPossiveis = descontosPossiveis;
    }

    public BigDecimal calcular(Orcamento orcamento){
        List<BigDecimal> descontos = new ArrayList<>();
        descontosPossiveis
            .stream()
            .forEach(desconto -> descontos.add(desconto.calcular(orcamento)));
        descontos.sort(BigDecimal::compareTo);
        return descontos.get(descontos.size() - 1);
    }
}
public class App {
    public static void main(String[] args) {
        Orcamento orcamento = new Orcamento(new BigDecimal("1000"), 6);
        List<Desconto> descontos = Arrays.asList(
                new DescontoPorQuantidade(),
                new DescontoPorValor()
        );
        CalculadoraDeDesconto calculadora = new CalculadoraDeDesconto(descontos);
        System.out.println(calculadora.calcular(orcamento));
    }
}

Entendo que dessa maneira não iriamos precisar mexer na classe da calculadora e o desconto sempre seria o maior da lista.

1 resposta

Oi Lucas,

Desse jeito funcionaria se apenas o maior desconto fosse aplicado. No caso de ter multiplos descontos acumulados, teria problemas.

Vai depender entao das regras de negocio e necessidades da aplicacao.

Bons estudos!