Olá.
Considere a implementação básica do padrão Strategy.
public class Context{
private Strategy strategy;
}
public interface Strategy{
void algoritmo();
}
public class ConcreteStrategyA implements Strategy{
void algoritmo(){
// algoritmo A
}
}
public class ConcreteStrategyB implements Strategy{
void algoritmo(){
// algoritmo B
};
A dúvida refere-se ao seu uso, ou seja, como instanciar os objetos ConcreteStrategyA e ConcreteStrategyC?
Penso na seguintes alternativa: crio o objeto, em uma camada de controle, por exemplo, e repasso para a classe Context, na qual invoca o método (polimórfico algoritmo();). Mas como saber qual o objeto correto instanciar? Teria que fazer uma lógica (uso de if/ else) para identificar o objeto correto. Mas dessa forma, fazendo uso de estruturas de condição, eu estaria criando um problema que o padrão Strategy procura resolver. Correto?
Para deixar mais claro, suponha o seguinte cenário: possuo uma classe CalculadoraDeTarifas (Context), ela recebe o tipo de veiculo(carro, moto, etc) e um periodo de tempo. Suponha ainda que tenho um Strategy TarifaStrategy que é a interface para DiariaMoto, DiariaCarro, PorHoraMoto, PorHoraCarro, MensalidadeMoto, MensalidadeCarro, etc.
Considere agora que preciso passar que uma moto permaneceu por um período de 15 horas. Nesse caso, como uma das regras é que, quando o período for superior a 12 horas é cobrado uma "Diária", para moto. Esse cálculo deveria estar no algoritmo() de DiariaMoro, correto? Se sim, como fazer com que ele seja executado?
Desculpe se não fui claro suficiente.
Obrigado.