Bom dia a todos.
Implementando o exercício 8 da aula 1 me deparei um uma situação que me deixou um pouco confuso.
Vamos lá ... Eu criei um enum para o "Tipo de Investidor" conforme segue.
package padrao_strategy.investimento;
public enum TipoDoInvestidor {
    CONSERVADOR,
    MODERADO,
    ARROJADO;    
}Logo após criei a classe do Investidor que recebe no construtor o seu perfil e o saldo.
package padrao_strategy.investimento;
public class Investidor {
    private TipoDoInvestidor tipoInvestidor;
    private double saldo;
    public Investidor(TipoDoInvestidor tipoInvestidor, double saldo) {
        this.tipoInvestidor = tipoInvestidor;
        this.saldo = saldo;        
    }
    public void deposita(double lucro) {
        this.saldo += lucro;
    }
    public double getSaldo() {
        return saldo;
    }
    public TipoDoInvestidor getTipoInvestidor() {
        return tipoInvestidor;
    }
}Após isso e analisando o exemplo da implementação do exercício do calculo do imposto implementei as seguintes classes:
1º Eu criei uma interface Investimento
package padrao_strategy.investimento;
public interface Investimento {
    double calcula(Investidor investidor);
}Logo após fui implementando as classes dos cálculos para os perfis CONSERVADOR, MODERADO e ARROJADO, conforme segue.
package padrao_strategy.investimento;
public class Conservador implements Investimento {
    public static final double RENTABILIDADE = 0.008;
    @Override
    public double calcula(Investidor investidor) {
        return investidor.getSaldo() * RENTABILIDADE;
    }
}package padrao_strategy.investimento;
import java.util.Random;
public class Moderado implements Investimento {
    public static final double RENTABILIDADE_MINIMA = 0.007;
    public static final double RENTABILIDADE_MAXIMA = 0.025;
    @Override
    public double calcula(Investidor investidor) {
        boolean escolhido = new Random().nextDouble() < 0.5;
        if( escolhido ) {
            return investidor.getSaldo() * RENTABILIDADE_MAXIMA;            
        } else {
            return investidor.getSaldo() * RENTABILIDADE_MINIMA;
        }
    }
}package padrao_strategy.investimento;
import java.util.Random;
public class Arrojado implements Investimento {
    public static final double RENTABILIDADE_MINIMA = 0.006;
    public static final double RENTABILIDADE_MEDIA  = 0.03;
    public static final double RENTABILIDADE_MAXIMA = 0.05;
    @Override
    public double calcula(Investidor investidor ) {
        double chance = new Random().nextDouble();;
        if( chance <= 0.2 )
            return investidor.getSaldo() * RENTABILIDADE_MAXIMA;
        else if (chance <= 0.3 )
            return investidor.getSaldo() * RENTABILIDADE_MEDIA;
        else 
            return investidor.getSaldo() * RENTABILIDADE_MINIMA;
    }
}Até ai tudo bem e parece bastante com a resolução do professor. Porém minha dúvida é a seguinte: Na minha classe Investidor ela recebe no construtor um enum com o perfil (CONSERVADOR, MODERADO, ARROJADO) ...
A classe RealizadorDeInvestimentos ficou assim:
package padrao_strategy.investimento;
public class RealizadorDeInvestimento {
    public void investir(Investidor investidor, Investimento investimento) {
        double resultado = investimento.calcula(investidor);
        System.out.println("O saldo atual do investidor é: " + investidor.getSaldo());
        investidor.deposita(resultado * 0.75);
        System.out.println("O saldo atualizado do investidor é:" + investidor.getSaldo());
    }
}E a classe Main ficou assim:
package padrao_strategy.investimento;
public class TesteDeInvestimento {
    public static void main(String[] args) {
        Investidor joao = new Investidor(TipoDoInvestidor.CONSERVADOR, 3500.0);
        Investimento investimento;
        if(joao.getTipoInvestidor() == TipoDoInvestidor.CONSERVADOR) {
            investimento = new Conservador();
        } else if ( joao.getTipoInvestidor() == TipoDoInvestidor.MODERADO ) {
            investimento = new Moderado(); 
        } else {
            investimento = new Arrojado();
        }
        RealizadorDeInvestimento realizadorDeInvestimento = new RealizadorDeInvestimento();
        realizadorDeInvestimento.investir(joao, investimento );
    }    
}Na classe de teste eu tenho que verificar o tipo do Perfil para instanciar o investimento correspondente ao seu perfil. Tem alguma forma de evitar utilizar os IFs para criar o investimento correto? Nesta aboragem eu quebrei o princípio da padrão Strategy?
Desde já agradeço.
 
             
            