
当我们考虑验证时,通常是复合模式。它大致描述为:
如果此有效,则执行SOMETHING 。
而且,正如您所强加的那样,您希望将多个检查器链接在一起以在其区域中执行验证,因此可以实施 “责任链” 模式。
考虑一下:
您可以有一个
Result对象,该对象可以包含有关失败的消息以及简单的true / false。
您可以拥有一个
ValidatorObject,该对象进行所需的任何验证并返回的实例
Result。
public interface Result { public boolean isOk(); public String getMessage();}// We make it genric so that we can use it to validate// any type of Object that we want.public interface Validator<T> { public Result validate(T value);}现在,当您说要使用多个检查器来验证“ X”时,您要强加一个 验证规则 ,该 规则
只是
Validator对象的集合,而只是其
Validator自身的实例。话虽如此,您不能再使用该
Result对象来检查规则的验证结果。您将需要一个
Result可以将结果保持为的复合对象
{Validator=Result}。看起来不是像的实现HashMap<Validator,Result>吗?是的,因为是。
现在,您可以实现
Rule和
CompositeResult:
public class Rule extends ArrayList<Validator> implements Validator { public Rule(Validator<?> ... chain) { addAll(Arrays.asList(chain)); } public Object validate(Object target) { CompositeResult result = new CompositeResult(size()); for (Validator rule : this) { Result tempResult = rule.validate(value); if (!tempResult.isOk()) result.put(rule, tempResult); } return result; }}public class CompositeResult extends HashMap<Validator, Result> implements Result { private Integer appliedCount; public CompositeResult(Integer appliedCount) { this.appliedCount = appliedCount; } @Override public boolean isOk() { boolean isOk = true; for (Result r : values()) { isOk = r.isOk(); if (!isOk) break; } return isOk; } @Override public String getMessage() { return toString(); } public Integer failCount() { return size(); } public Integer passCount() { return appliedCount - size(); }}就是这样!现在,要实现您的检查器:
public class Checker1 implements Validator<Integer> { }public class CheckerN implements Validator<Integer> { }现在该进行验证了:
Validator<Integer> checkingRule = new Rule(new Checker1(), new CheckerN());CompositeResult result = checkingRule.validate(yourParameter);if (result.isOk()) System.out.println("All validations passed");else System.out.println(result.getFailedCount() + " validations failed");简单而整洁。
我在公共仓库中上传了一个示例供您试用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)