2
respostas

Strategy - Como realizar o cálculo de todos os impostos?

Digamos que no meu sistema existam 50 impostos diferentes. Gostaria de saber a melhor forma de realizar o cálculo de todos os impostos existentes, por exemplo: "Criar um ENUM de cada imposto, e implementar o construtor do imposto no ENUM, e fazer um FOREACH?"

public enum Impostos {

    ISS(new ISS()), 
    ICMS(new ICMS());

    private Imposto imposto;

    Impostos(Imposto imposto) {
        this.imposto = imposto;
    }

    public Imposto getImposto() {
        return imposto;
    }

}

public class TesteDeImpostos {

    public static void main(String[] args) {

        Orcamento orcamento = new Orcamento(500.0);

        CalculadorDeImpostos calculador = new CalculadorDeImpostos();

        for (Impostos i : Impostos.values()) {
            calculador.realizaCalculo(orcamento, i.getImposto());
        }

    }

}
2 respostas

Oi Braulio, tudo bem?

Entre as diversas maneiras de resolver seu problema, eu faria o seguinte, receberia varias classes de imposto no contrutor

public enum Impostos {

    IMPOSTO_SOBRE_IMOVEL(new ImpostoA(), new ImpostoB(), new ImpostoC()), 
    IMPOSTO_SOBRE_CARRO(new ImpostoCarroA());

    private Imposto[] impostos;

    Impostos(Imposto... impostos) {
        this.imposto = imposto;
    }

    public Imposto[] getImpostos() {
        return impostos;
    }

   public double calculaImpostoTotal(){
    double total = 0;
    for(Imposto i: impostos){
        total += i.getImposto();
    }
    return total;
 }

}

public class TesteDeImpostos {

    public static void main(String[] args) {

        Orcamento orcamento = new Orcamento(500.0);

        CalculadorDeImpostos calculador = new CalculadorDeImpostos();

        for (Impostos i : Impostos.values()) {
            calculador.realizaCalculo(orcamento, i.calculaImpostoTotal());
        }

    }

}

A vantagem é que agora pode agrupar impostos por categorias, e pode sempre adicionar e remover um imposto novo, facilmente.

Outra opção viavel, seria usar o Pattern Chain of Responsibility.

Nesse caso não usaria o Strategy pois para cada imposto teríamos uma estratégia esse é um trade off do padrão e 50 concretes Strategy ao meu ver é muita coisa, eu colocaria esses impostos numa listas e aplicaria eles dado uma condição todos de uma vez com o Observer.

Espero ter ajudado e bons estudos.