Solucionei o problema citado na aula da seguinte maneira. Está correto? Seguem abaixo os códigos utilizados:
public class CalculadoraDeDescontos {
private List<Desconto> descontos;
public CalculadoraDeDescontos(List<Desconto> descontos){
this.descontos = descontos;
}
public BigDecimal calcular(Orcamento orcamento){
for (Desconto desconto:this.descontos) {
if(desconto.calcular(orcamento).compareTo(BigDecimal.ZERO) > 0){
System.out.println("** DESCONTO APLICADO ** - (" + desconto.getDescricao() + ")");
return desconto.calcular(orcamento);
}
System.out.println("** NÃO APTO AO DESCONTO ** - (" + desconto.getDescricao() + ")");
}
return BigDecimal.ZERO;
}
}
Criei 3 tipos de desconto que utilizam da mesma interface - Abaixo segue 1 deles .
public class DescontoMaximo implements Desconto{
private String descricao = "15% por quantidade de itens maior que 5 e valor maior que 500";
@Override
public String getDescricao() {
return this.descricao;
}
@Override
public BigDecimal calcular(Orcamento orcamento) {
if(orcamento.getQuantidadeItens() > 5 && orcamento.getValor().compareTo(new BigDecimal("500")) > 0){
return orcamento.getValor().multiply(new BigDecimal("0.15"));
}
return BigDecimal.ZERO;
}
}
public class TestesDescontos {
public static void main(String[] args) {
Orcamento orcamento = new Orcamento(new BigDecimal("100"), 2); // Não apto a nenhum desconto
Orcamento orcamento2 = new Orcamento(new BigDecimal("300"), 6); // Apto ao desconto de quantidade
Orcamento orcamento3 = new Orcamento(new BigDecimal("600"), 2); // Apto ao desconto de valor
Orcamento orcamento4 = new Orcamento(new BigDecimal("600"), 6); // Apto aos dois descontos
// Ordenar os descontos de maneira decrescente (Maior % pra menor)
List<Desconto> listaDescontos = new ArrayList<>();
listaDescontos.add(new DescontoMaximo()); // 15%
listaDescontos.add(new DescontoValorAlto()); // 10%
listaDescontos.add(new DescontoMuitosItens()); // 5%
CalculadoraDeDescontos calculadora = new CalculadoraDeDescontos(listaDescontos);
System.out.println("Valor de desconto: R$" + calculadora.calcular(orcamento4));
System.out.println("-------------------------------------");
}
}