Durante a aula, logo quando foi explicado o problema, eu pausei o video e fiz essa implementação, colocando o calculo dentro de cada enum. Essa seria uma possível variação da implementação do do Strategy, ou existe algum problema em implementar dessa maneira?
public class TestFluxo {
public static void main(String[] args) {
Orcamento orcamento = new Orcamento(new BigDecimal("10.000"));
CalculadoraDeImpostoImpl calculadoraDeImposto = new CalculadoraDeImpostoImpl();
System.err.println(calculadoraDeImposto.calcula(orcamento, TipoImpostoEnum.COFINS));
System.err.println(calculadoraDeImposto.calcula(orcamento, TipoImpostoEnum.ICMS));
System.err.println(calculadoraDeImposto.calcula(orcamento, TipoImpostoEnum.ISS));
}
}
public class CalculadoraDeImpostoImpl {
public BigDecimal calcula(Orcamento orcamento, TipoImpostoEnum imposto) {
return imposto.calcula(orcamento);
}
}
public class Orcamento {
public Orcamento(BigDecimal valor) {
this.valor = valor;
}
private BigDecimal valor;
public BigDecimal getValor() {
return this.valor;
}
}
public enum TipoImpostoEnum {
ICMS() {
@Override
BigDecimal calcula(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.3"));
}
},
ISS() {
@Override
BigDecimal calcula(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.10"));
}
},
COFINS() {
@Override
BigDecimal calcula(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.5"));
}
};
abstract BigDecimal calcula(Orcamento orcamento);
}