2
respostas

Padrão Decorator somando somente dois impostos

Boa tarde!

A forma como foi implementado o cálculo de orçamentos, percebi que somente faz a soma dos dois primeiros impostos. Se passarmos 3, exemplo: calculadora.calcular(orcamento, new ICMS(new INSS(new ICSS(null))))); o ICSS não é incluso no cálculo.

Alterei o método calcular da classe abstrata Imposto, no lugar do if fiz um while

        // ANTES
        if(outro !=null) {
            valorDoOutroImposto = outro.realizarCalculo(orcamento);
        }

        // DEPOIS
        while(outro != null) {
            valorDoOutroImposto = outro.realizarCalculo(orcamento);
            valorTotalImposto = valorTotalImposto.add(valorDoOutroImposto);
            this.outro = outro.getOutro();
        }

Poderiam me dizer se há outra forma mais elegante do que essa para resolver esse problema ou esse while que eu fiz está bom?

2 respostas

Oi Gabriel,

Posta aqui o código completo das suas classes para eu dar uma olhadinha, pois acredito que deveria somar normalmente todos.

Oi Rodrigo, segue as classes.

CalculadoraDeImpostos.java

public class CalculadoraDeImpostos {

    public BigDecimal calcular(Orcamento orcamento, Imposto imposto) {
        return imposto.calcular(orcamento);
    }

}

Classe Imposto.java

public abstract class Imposto2 {

    private Imposto2 outro;

    public Imposto2(Imposto2 outro) {
        this.outro = outro;
    }

    protected abstract BigDecimal realizarCalculo(Orcamento orcamento);

    public BigDecimal calcular(Orcamento orcamento) {
        BigDecimal valorImposto = realizarCalculo(orcamento);
        BigDecimal valorDoOutroImposto = BigDecimal.ZERO;

        if(outro !=null) {
            valorDoOutroImposto = outro.realizarCalculo(orcamento);
        }

        return valorImposto.add(valorDoOutroImposto);
    }

}

Ele entra no if, calcula o valor do outro, no caso o nosso segundo imposto, e depois já vai para o return... assim acaba ignorando quando tiver um terceiro imposto.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software