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.