2
respostas

Alternativa de solução

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("-------------------------------------");
    }
}
2 respostas

Alterei a solução, criando uma classe "ListaDescontos" e tirando a inserção de descontos do "TestesDescontos", segue abaixo os códigos:

public class ListaDescontos extends ArrayList<Desconto> {

    // Essa classe serve para armazenar todos os descontos
    // Ordenar os descontos de maneira decrescente (Maior % pra menor)
    public ListaDescontos() {
        super.add(new DescontoMaximo()); //15%
        super.add(new DescontoValorAlto()); //10%
        super.add(new DescontoMuitosItens()); //5%
    }
}
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

        CalculadoraDeDescontos calculadora = new CalculadoraDeDescontos(new ListaDescontos());
        System.out.println("Valor de desconto: R$" + calculadora.calcular(orcamento));
        System.out.println("-------------------------------------");
    }
}

Olá, Iago!

Pelo que pude entender do seu código, você criou uma classe CalculadoraDeDescontos que recebe uma lista de descontos e, a partir disso, calcula o desconto aplicável ao orçamento. Além disso, você criou três tipos de desconto que utilizam a mesma interface.

Uma sugestão que posso dar é que você poderia adicionar alguns comentários no código para deixar mais claro o que cada parte do código está fazendo. Isso pode ajudar a facilitar a compreensão do seu código por outras pessoas que venham a trabalhar nele.

Espero ter ajudado e bons estudos!