Esta pregunta es una especie de continuación de mi publicación anterior: Visitor pattern implementation in java- How does this look?Patrón de estrategia compuesta - java - ¿Qué tan malo es este código?
Me confundí un poco al refacturar mi código. Estoy tratando de convertir mi patrón de visitante (explicado en la publicación anterior) en un patrón de estrategia compuesto. Estoy tratando de hacer algo como esto:
public interface Rule {
public List<ValidatonError> check(Validatable validatable);
}
Ahora, me gustaría definir una regla como la siguiente:
public class ValidCountryRule {
public List<ValidationError> check(Validatable validatable) {
// invokeDAO and do something, if violation met
// add to a list of ValidationErrors.
// return the list.
}
}
Ahora, podría haber dos tipos diferentes objetos para ser validado. Estos dos podrían ser completamente diferentes: Supongamos que tengo una tienda que es Validatable
, y luego una Schedule
que es Validatable
. Ahora, si me gustaría escribir un compuesto que se vería así:
class Validator implements Rule {
private List<Rule> tests = new ArrayList<Rule>();
public void addRule(Rule rule) {
tests.add(rule);
}
public List<ValidationError> check(Visitable visitable) {
List<ValidationError> list = new ArrayList<ValidationError>();
for(Rule rule : tests) {
list.addAll(rule.check(visitable);
}
}
public Validator(ValidatorType type) {
this.tests = type.getRules();
}
}
Yo definiría un enum
que define qué conjunto de controles de ir a donde ...
public Enum ValidatorType {
public abstract List<Rule> getRules();
STORE_VALIDATOR {
public List<Rule> getRules() {
List<Rule> rules = new ArrayList<Rule>();
rules.add(new ValidCountryRule());
rules.add(new ValidXYZRule());
}
// more validators
}
y, por último, me gustaría utilizar es así:
Validator validator = new Validator(ValidatorType.STORE_VALIDATOR);
for (Store store : stores) {
validator.check(store);
}
Tengo la extraña sensación de que mi diseño es defectuoso. No me gusta la idea de que mi interfaz de reglas espere un Validatable
. ¿Podría sugerirme cómo mejoraría esto?
Agradecemos su ayuda.
Estás rompiendo todas las reglas de indentación. Si desea que los demás lo miren y lo ayuden con algo, su código debe verse un poco mejor.En este momento tiene un código horrible. –
@Trevor Perdón por eso, lo arreglé ahora. – Jay
La sangría todavía era algo ilegible. Lo arreglé. – Eddie