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