我有一小组验证类,我已经创建了这些类,这些类已经很好地服务了我,但是现在我需要更新它们以处理优先级规则。如果满足高优先级规则,那么我不需要运行任何进一步的验证,因为我们只会告诉用户一条单独的错误消息,而不是将全部消息添加到用户。Typesafe优先级规则
下面是一组类,我有:
//Rule.java
public interface Rule<T> {
List<ErrorMessage> validate(T value);
}
//ValidationStrategy.java
public interface ValidationStrategy<T> {
public List<Rule<? super T>> getRules();
}
//Validator.java
public class Validator<T> implements Rule<T> {
private List<Rule<? super T>> tests = new ArrayList<Rule<? super T>>();
public Validator(ValidationStrategy<T> type) {
this.tests = type.getRules();
}
public List<ErrorMessage> validate(T value) {
List <ErrorMessage> errors = new ArrayList<ErrorMessage>();
for (Rule<? super T> rule : tests) {
errors.addAll(rule.check(value));
}
return errors;
}
}
我有一些麻烦,修改该代码来处理优先规则。当然,有些东西我可以修改使用,而不是引入规则引擎。
理想那么我可以这样创建规则:
private static final Rule<SomeClass> ensureAllFieldsNotBlank = new Rule<SomeClass>(RulePriority.HIGHEST) {
public List<ErrorMessage> check(SomeClass someClass) {
List<ErrorMessage> errors = new ArrayList<ErrorMessage>();
if (StringUtils.isBlank(someClass.getValue1())
&& StringUtils.isBlank(someClass.getValue2())
&& StringUtils.isBlank(someClass.getValue3())) {
errors.add("Provide a response for \"" + someClass.getName() + "\"");
}
return errors;
}
};
编辑更新类:
//ValidationStrategy.java
public interface ValidationStrategy<T> {
public List<Rule<? super T>> getRules(RulePriority rulePriority);
}
//RulePriority.java
public enum RulePriority { HIGHEST, DEFAULT, LOWEST; }
//Validator.java
public class Validator<T> implements Rule<T> {
private List<Rule<? super T>> tests = new ArrayList<Rule<? super T>>();
private ValidationStrategy<T> validationStrategy;
public Validator(ValidationStrategy<T> validationStrategy) {
this.validationStrategy = validationStrategy;
for (RulePriority rp : RulePriority.values()) {
this.tests.addAll(validationStrategy.getRules(rulePriority));
}
}
public List<ErrorMessage> validate(T value) {
List<ErrorMessage> errors = new ArrayList<String>();
for (RulePriority rp : RulePriority.values()) {
for (Rule<? super T> rule : validationStrategy.getRules(rp)) {
errors.addAll(rule.validate(value));
}
if (errors.size() > 0) {
break;
}
}
return errors;
}
我喜欢这种方法,但我只想指出,很容易让`compareTo()`与`equals()`一致 - 只需调用它即可!如果他们相等返回0,否则返回任何东西,但。 – CurtainDog 2010-11-25 03:32:56