Estou implementando um validador de campos de formulário que submete o valor passado em cada campo a um conjunto de regras (e.g. obrigatório, maior que x, menor que y).
Achei o problema similar ao que é resolvido com o padrão Chain of Responsability, entretanto há uma diferença importante: durante a validação, várias - e não apenas uma - regra pode ser aplicada.
Por conta disso, acabei implementando a solução de outra forma. Segue abaixo parte do código para avaliação.
Gostaria de saber se essa mudança descaracteriza o problema resolvido pelo padrão e, caso sim, existe outro padrão de projeto para esse tipo de problema?
A interface que representa uma regra.
public interface Regra {
public Violacao validar(Componente campo, String valor);
}
A implementação da regra de preenchimento obrigatório.
public class PreenchimentoObrigatorio implements Regra {
public static final String CHAVE_VIOLACAO = "preenchimento.obrigatorio";
@Override
public Violacao validar(Componente campo, String valor) {
if (campo.getColunaNotNull())
if (valor.isEmpty())
return new Violacao(CHAVE_VIOLACAO, campo.getHtmlId());
return null;
}
}
Classe que representa o validador.
public class ValidadorRegistro {
List<Regra> regras;
Map<String, Mensagem> violacoes = new HashMap<>();
public ValidadorRegistro() {
regras = Arrays.asList(new PreenchimentoObrigatorio());
}
public List<Mensagem> validar(List<Componente> campos, Map<String, TypedValue> valor) {
if (!regras.isEmpty())
campos.forEach(campo -> {
if (valor.get(campo.getHtmlId()) != null && valor.get(campo.getHtmlId()).getValue() != null) {
regras.forEach(regra -> {
adicionarViolacao(regra.validar(campo, valor.get(campo.getHtmlId()).getValue().toString()));
});
}
});
return new ArrayList<Mensagem>(violacoes.values());
}
...
}