Em diversos códigos que vi por ai sobre o padrão strategy, é utilizado um Enum que funciona como se fosse a condição para aplicar uma estratégia ou outra. No exemplo abaixo temos uma implementação de strategy, no caso vai ser aplicado uma determinada estratégia para validar um funcionário de acordo com o TipoFuncionário(Enum). No entanto na vida real é mais natural que o TipoFuncionario, Cargo,etc... na realidade estejam salvas em um banco de dados e TipoFuncionario seja uma entidade JPA e não um enum. Como aplicar esse padrão substituindo a Enumeration por uma entidade JPA? ou elas como elas podem trabalhar juntas?
public interface FuncionarioValidator {
void validate(Funcionario f) throws Exception;
}
public class CeletistaValidator implements FuncionarioValidator {
@Override
public void validate(Funcionario f) throws Exception {
System.out.println(f.getNome() + " -> " + getClass().getName());
}
}
public class QuadroPermanenteValidator implements FuncionarioValidator {
@Override
public void validate(Funcionario f) throws Exception {
System.out.println(f.getNome() + " -> " + getClass().getName());
}
}
public class SurfistaValidator implements FuncionarioValidator {
@Override
public void validate(Funcionario f) throws Exception {
System.out.println(f.getNome() + " -> " + getClass().getName());
}
}
public enum TipoFuncionario {
Celetista(new CeletistaValidator()),
QuadroPermanente(new QuadroPermanenteValidator()),
Surfista(new SurfistaValidator());
private FuncionarioValidator validator;
private TipoFuncionario(FuncionarioValidator validator) {
this.validator = validator;
}
public FuncionarioValidator getValidator() {
return validator;
}
}
public class Funcionario {
private Integer id;
private String nome;
private TipoFuncionario tipo;
public Funcionario(Integer id, String nome, TipoFuncionario tipo) {
this.id = id;
this.nome = nome;
this.tipo = tipo;
}
public Integer getId() {
return id;
}
public String getNome() {
return nome;
}
public TipoFuncionario getTipo() {
return tipo;
}
}
public class FuncionarioTest {
@Test
public void test() throws Exception {
//cria lista de funcionários
List<Funcionario> funcionarios = new ArrayList<Funcionario>();
funcionarios.add(new Funcionario(1, "João", TipoFuncionario.Celetista));
funcionarios.add(new Funcionario(2, "José", TipoFuncionario.QuadroPermanente));
funcionarios.add(new Funcionario(3, "Maria", TipoFuncionario.Surfista));
//valida todos
for (Funcionario funcionario : funcionarios) {
funcionario.getTipo().getValidator().validate(funcionario);
}
}
}