Olá Pessoal, boa tarde… tenho um sistema em que vou refatorar algumas classes e usar o padrão strategy.
Seria mais ou menos assim. Eu tenho várias lojas, e cada loja possui uma maneira de calcular as taxas. Quando eu entro no sistema eu faço uma querie no banco para carregar a minha loja…
Agora vem a minha dúvida… quero substituir os IFS com os códigos das lojas que fazem a ligação com o tipo de taxa que eu vou calcular…
por Ex: Carreguei a loja id = 5 que dentro do sistema calcula IOF. Não quero que no meu código eu tenha o seguinte:
if(id==5) Imposto imposto = new IOF();
else if (id==6) Imposto = new ICMS();
Ou seja, eu preciso colocar Ifs para decidir qual objeto eu irei instanciar, pois eu estou buscando do banco de dados o código da loja e o tipo de imposto.
Estou confuso na utilização de algum padrão para resolver esse detalhe…
Strategy tem if tbem, mas é mais elegante usar enum…
eis um exemplo:
//interface com algum metedo e tal...
public interface Locomocao{}
//classes concretas
public class Carro implements Locomocao{}
public class Moto implements Locomocao{}
public class Bicicleta implements Locomocao{}
public class Skate implements Locomocao{}
//enum pra ficar elegante
public enum TipoLocomocao{}
//Escolher qual Estratégia
public class LocomocaoFactory{
public Locomocao escolherEstrategia(TipoLocomocao tipo){
switch(tipo){
case TipoLocomocao.SKATE: return new Skate();
//outros aqui
default: throw new Exception("Tipo nao reconhecido");
}
}
}
Opa, muito obrigado !!! Tinha pensado em algo como um mapa, mas posso adaptar usar enum também… algo como passar o código e me retornar a descrição na enum…
Não tem como evitar os if’s pois em determinado momento você vai precisar saber quem é quem.
Mas usar Strategy e Factory deixa a coisa mais elegante (e ao meu ver mais mantenível, pois a tomada de decisão esta no Factory e não espalhada em vários pontos).