Pessoal fiz um pouco diferente e gostaria da opinião de vocês.
package br.com.schimidtsolutions.estudo.investimento;
public interface Investimento {
double calcularRendimentoLiquido(ContaBancaria contaBancaria);
}
package br.com.schimidtsolutions.estudo.investimento;
public class InvestimentoConservador implements Investimento {
private static final double TAXA_RENTABILIDADE_UNICA = 0.008;
private final Imposto imposto;
public InvestimentoConservador(final Imposto imposto) {
this.imposto = imposto;
}
public InvestimentoConservador() {
this(new ImpostoPadrao());
}
@Override
public double calcularRendimentoLiquido(final ContaBancaria contaBancaria) {
return imposto.calcularValorLiquidoSobreLucro(contaBancaria.getSaldo() * TAXA_RENTABILIDADE_UNICA);
}
}
package br.com.schimidtsolutions.estudo.investimento;
import java.util.Random;
public class InvestimentoModerado implements Investimento {
private static final double TAXA_RENTABILIDADE_MAXIMA = 0.025;
private static final double TAXA_RENTABILIDADE_MINIMA = 0.007;
private final Imposto imposto;
private final Random geradorNumeroRandomico;
public InvestimentoModerado(final Imposto imposto) {
this.imposto = imposto;
this.geradorNumeroRandomico = new Random();
}
public InvestimentoModerado() {
this(new ImpostoPadrao());
}
private double calcularTaxaRentabilidade() {
return geradorNumeroRandomico.nextInt(2) == 0 ? TAXA_RENTABILIDADE_MAXIMA : TAXA_RENTABILIDADE_MINIMA;
}
@Override
public double calcularRendimentoLiquido(final ContaBancaria contaBancaria) {
final double lucroRealizado = contaBancaria.getSaldo() * calcularTaxaRentabilidade();
return imposto.calcularValorLiquidoSobreLucro(lucroRealizado);
}
}
package br.com.schimidtsolutions.estudo.investimento;
import java.util.Random;
public class InvestimentoArrojado implements Investimento {
private static final double TAXA_RENTABILIDADE_MAXIMA = 0.05;
private static final double TAXA_RENTABILIDADE_MEDIANA = 0.03;
private static final double TAXA_RENTABILIDADE_MINIMA = 0.006;
private final Imposto imposto;
private final Random geradorNumeroRandomico;
public InvestimentoArrojado(final Imposto imposto) {
this.imposto = imposto;
geradorNumeroRandomico = new Random();
}
public InvestimentoArrojado() {
this(new ImpostoPadrao());
}
@Override
public double calcularRendimentoLiquido(final ContaBancaria contaBancaria) {
final double lucroRealizado = contaBancaria.getSaldo() * calcularTaxaRentabilidade();
return imposto.calcularValorLiquidoSobreLucro(lucroRealizado);
}
private double calcularTaxaRentabilidade() {
final int chanceSorteada = geradorNumeroRandomico.nextInt(10);
double rentabilidadeSelecionada = 0;
if (chanceSorteada <= 1) {
rentabilidadeSelecionada = TAXA_RENTABILIDADE_MAXIMA;
} else if (chanceSorteada <= 4) {
rentabilidadeSelecionada = TAXA_RENTABILIDADE_MEDIANA;
} else {
rentabilidadeSelecionada = TAXA_RENTABILIDADE_MINIMA;
}
return rentabilidadeSelecionada;
}
}
package br.com.schimidtsolutions.estudo.investimento;
public class ContaBancaria {
private final String cliente;
private double saldo;
public ContaBancaria(final String cliente, final double valor) {
this.cliente = cliente;
saldo = valor;
}
public String getCliente() {
return cliente;
}
public double getSaldo() {
return saldo;
}
public void depositar(final double valorDeposito) {
saldo += valorDeposito;
}
@Override
public String toString() {
return String.format("ContaBancaria [cliente=%s, saldo=%s]", cliente, saldo);
}
}
package br.com.schimidtsolutions.estudo.investimento;
public interface Imposto {
double calcularValorLiquidoSobreLucro(double valorBruto);
}
package br.com.schimidtsolutions.estudo.investimento;
public class ImpostoPadrao implements Imposto {
@Override
public double calcularValorLiquidoSobreLucro(final double valorBruto) {
return valorBruto * 0.75;
}
}
package br.com.schimidtsolutions.estudo.investimento;
public class RealizadorDeInvestimentos {
public void executarInvestimentoSobreConta(final Investimento investimento, final ContaBancaria contaBancaria) {
final double lucroLiquido = investimento.calcularRendimentoLiquido(contaBancaria);
contaBancaria.depositar(lucroLiquido);
System.out.println(contaBancaria);
}
}