Oi, boa tarde ^-^
Também estou iniciando no Java, mas acho que uma solução para isso seria criando uma nossa classe do tipo Enum e implementando o Strategy, você faria o seguinte:
Uma Classe TipoDeImposto
do tipo enum.
public enum TipoDeImposto {
ICMS {
@Override
void calcularImposto() {
///Regra para calcularImposto do tipo ICMS
}
},
ISS {
@Override
void calcularImposto() {
///Regra para calcularImposto do tipo ISS
}
};
abstract void calcularImposto();
}
Para chamar você usaria TipoDeImposto.ICMS.calcularImposto();
Com isso você pode ter regras dinstintas de imposto, e caso você adicione outras formas de calcular imposto, não ira afetar outras classes que usam o TipoDeImposto.ICMS.calcularImposto()
ou seja você pode mexer adicionar ou remover tipos diferentes, sem quebrar o codigo já que o TipoDeImposto não sabe como está sendo calculado.
Caso você queria utilizar o Orcamento
ou a CalculadoraDeImpostos
1º ─ você pode passar ela como parametro do método calcularImposto por exemplo:
abstract void calcularImposto();
──> abstract void calcularImposto(Orcamento orcamento, CalculadoraDeImpostos calculadora);
Eu não acho essa a melhor forma por 2 motivos, o primeiro é que você 'força' todas as classes a utilizarem a calculadora e o orcamento, caso você ache que todos os tipos de forma de imposto que você adicionar no futuro, irão ter que utilizar a calculadora e o orçamento você pode passar como paramento.
2º ─ você pode utilizar composição (eu acho bem mais interessante):
A composição seria criar um objeto, que irá ser utilizado por aquela classe por exemplo, eu criaria um objeto que calcula a porcentagem sobre o valor e faria o seguinte:
abstract void calcularImposto();
──> abstract void calcularImposto(BigDecimal valor);
ICMS {
@Override
void calcularImposto(BigDecimal valor) {
///Regra para calcularImposto do tipo ICMS
BigDecimal valorRetornadoDaCalculadora = Calculadora.calcularPorcentagem(valor, 5); /// <── eu criaria um Caculadora que calcularia a porcetagem de acordo com o valor e a porcentagem.
System.out.println(valorRetornadoDaCalculadora);
}
},
Com isso você poderia definir varios métodos diferentes de calculos de pocentagem na calculadora, por exemplo supondo que o BigDecimal valor do parametro for = 100:
O console pode retorna 5% de 100 que é igual a 5.
Pode reduzir esse valor de 5% do valor 100 então o console faria um print de 95.
Pode somar esse valor com o 100 por exemplo, fazendo o console 'printar' 105.
Você pode criar essa classe Calculadora e adicionar todos esses métodos, e só utilizar o que você necessitar de acordo com a sua necessidade.
E por ultimo caso você queira trocar a regra ou o valor da porcentagem por exemplo do ICMS
você só irá precisar trocar em 1 lugar facilitando a manutenção do código, e caso você queira adicionar uma nova forma de calcula você pode criar na calculadora e usar essa regra onde há necessidade.
Acho que é isso espero ter ajudado :)