如何在Java中链接检查

如何在Java中链接检查,第1张

如何在Java中链接检查

当我们考虑验证时,通常是复合模式。它大致描述为:

如果此有效,则执行SOMETHING

而且,正如您所强加的那样,您希望将多个检查器链接在一起以在其区域中执行验证,因此可以实施 “责任链” 模式。

考虑一下:

您可以有一个

Result
对象,该对象可以包含有关失败的消息以及简单的true / false。

您可以拥有一个

Validator
Object,该对象进行所需的任何验证并返回的实例
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");

简单而整洁。

我在公共仓库中上传了一个示例供您试用。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5439636.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存