Template Method

Imposto.java

 

interface Imposto {

 double calcula(Orcamento orcamento);

}

 

ICMS.java

 

class ICMS implements Imposto {

 

 public double calcula(Orcamento orcamento) {

         return orcamento.getValor() * 0.1;

 }

 

}

 

ISS.java

 

class ISS implements Imposto {

 

 public double calcula(Orcamento orcamento) {

         return orcamento.getValor() * 0.06;

 }

}

 

TempladeDeImpostoCondicional.java

 

abstract class TemplateDeImpostoCondicional implements Imposto {

 

  public double calcula(Orcamento orcamento) {

 

    if(deveUsarMaximaTaxacao(orcamento)) {

      return maximaTaxacao(orcamento);

     } else {

      return minimaTaxacao(orcamento);

     }

   }        

 

  public abstract boolean deveUsarMaximaTaxacao(Orcamento orcamento);

  public abstract double maximaTaxacao(Orcamento orcamento);

  public abstract double minimaTaxacao(Orcamento orcamento);

}

 

ImpostoY.java

 

class ImpostoY extends TemplateDeImpostoCondicional {

 

  public boolean deveUsarMaximaTaxacao(Orcamento orcamento) {

    return orcamento.getValor() > 500 && temItemMaiorQue100ReaisNo(orcamento);

   }

  public double maximaTaxacao(Orcamento orcamento) {

    return orcamento.getValor() * 0.10;  

   }

  public double minimaTaxacao(Orcamento orcamento) {

    return orcamento.getValor() * 0.06;

   }

 

  private boolean temItemMaiorQue100ReaisNo(Orcamento orcamento) {

         

         for (Item item : orcamento.getItens()) {

                 if (item.getValor() > 100)

                         return true;

         }

         

         return false;

   }

 }

 

ImpostoX.java

 

class ImpostoX extends TemplateDeImpostoCondicional {

 

  public boolean deveUsarMaximaTaxacao(Orcamento orcamento) {

    return orcamento.getValor() > 500;

   }

  public double maximaTaxacao(Orcamento orcamento) {

    return orcamento.getValor() * 0.07;

   }

  public double minimaTaxacao(Orcamento orcamento) {

    return orcamento.getValor() * 0.05;

   }

 }

 

 

CalculadorDeImpostos.java

 

class CalculadorDeImpostos {

 

 public void realizaCalculo(Orcamento orcamento, Imposto imposto) {

 

         double valor = imposto.calcula(orcamento);

         System.out.println(valor);

 }

}

 

Principal.java

 

public class Principal {

 

 public static void main(String[] args) {

 

         Orcamento orcamento = new Orcamento(500.0);

         CalculadorDeImpostos calculador = new CalculadorDeImpostos();

 

         // Calculando o ISS

         calculador.realizaCalculo(orcamento, new ISS());

 

         // Calculando o ICMS

         calculador.realizaCalculo(orcamento, new ICMS());

         

         // imposto X

         calculador.realizaCalculo(orcamento, new ImpostoX());

         

         // imposto Y

         calculador.realizaCalculo(orcamento, new ImpostoY());

 

 }

 

}