Fala galera,
Eu estou com um problema na hora de usar o Decorator nas classes ICPP e IKCV. Não estou conseguindo fazer o calculo composto com elas porque o atributo outroImposto sempre vem null. Eu não consegui identificar o motivo, então estou postando s códigos aqui para me ajduarem.
public abstract class TemplateDeImpotoCondicional extends Imposto {
private static Imposto outroImposto;
public TemplateDeImpotoCondicional(Imposto outrImpoto) {
super(outroImposto);
}
public TemplateDeImpotoCondicional() {}
@Override
public double calcula(Orcamento orcamento) {
if (deveUsarMaxTaxacao(orcamento))
return maximaTaxacao(orcamento) + calculoDoOutroImposto(orcamento);
else
return minimaTaxacao(orcamento) + calculoDoOutroImposto(orcamento);
}
public abstract boolean deveUsarMaxTaxacao(Orcamento orcamento);
public abstract double minimaTaxacao(Orcamento orcamento);
public abstract double maximaTaxacao(Orcamento orcamento);
}
public class IKCV extends TemplateDeImpotoCondicional {
public IKCV() {}
public IKCV(Imposto outrImpoto) {
super(outrImpoto);
}
private boolean temItemMaiorQueCemReiasNo(Orcamento orcamento) {
for (Item item : orcamento.getItens()) {
if (item.getValor() > 100) return true;
}
return false;
}
@Override
public boolean deveUsarMaxTaxacao(Orcamento orcamento) {
return orcamento.getValor() > 100 && temItemMaiorQueCemReiasNo(orcamento);
}
@Override
public double minimaTaxacao(Orcamento orcamento) {
return orcamento.getValor() * 0.06;
}
@Override
public double maximaTaxacao(Orcamento orcamento) {
return orcamento.getValor() * 0.10;
}
}
public class ICPP extends TemplateDeImpotoCondicional {
public ICPP() { }
public ICPP(Imposto outrImpoto) {
super(outrImpoto);
}
@Override
public double minimaTaxacao(Orcamento orcamento) {
return orcamento.getValor() * 0.05;
}
@Override
public double maximaTaxacao(Orcamento orcamento) {
return orcamento.getValor() * 0.07;
}
@Override
public boolean deveUsarMaxTaxacao(Orcamento orcamento) {
return orcamento.getValor() > 500;
}
}
public abstract class Imposto {
protected Imposto outroImposto;
public Imposto(Imposto outroImposto) {
this.outroImposto = outroImposto;
}
public Imposto() {}
public abstract double calcula(Orcamento orcamento);
protected double calculoDoOutroImposto(Orcamento orcamento) {
if (this.outroImposto != null)
return outroImposto.calcula(orcamento);
return 0;
}
}
public class TesteDeImpostosComplexos {
public static void main(String[] args) {
Imposto ikcv = new IKCV(new ICPP());
Orcamento orcamento = new Orcamento(500);
double valor = ikcv.calcula(orcamento);
System.out.println(valor);
}
}