Этот вопрос является продолжением моего предыдущего поста: Реализация шаблона посетителя в java - Как это выглядит?
Я немного запутался при рефакторинге своего кода. Я пытаюсь преобразовать свой шаблон посетителя (объясненный в предыдущем посте) в шаблон составной стратегии. Я пытаюсь сделать что-то вроде этого:
public interface Rule {
public List<ValidatonError> check(Validatable validatable);
}
Теперь я бы определил правило следующим образом:
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.
}
}
Теперь я могу проверить объекты двух разных типов. Эти два могут быть совершенно разными: скажем, у меня есть Магазин, который Validatable
, а затем Schedule
, который Validatable
. Теперь, если бы я написал композицию, которая бы выглядела так:
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();
}
}
Я бы определил enum
, который определяет, какой набор проверок куда ...
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
}
и, наконец, я бы использовал это так:
Validator validator = new Validator(ValidatorType.STORE_VALIDATOR);
for (Store store : stores) {
validator.check(store);
}
У меня странное ощущение, что мой дизайн несовершенен. Мне не нравится идея, что мой интерфейс правил ожидает Validatable
. Не могли бы вы подсказать, как мне это улучшить?
Ценю вашу помощь.