避免在验证器列表上进行两次传递

时间:2015-03-15 12:19:27

标签: java design-patterns factory

我使用以下代码验证传递给文件中一系列命令的参数:

            for (Parameter p : s.getCommand(idx).getParameters()) {
                for (ValidationFactory.TYPES validationType : ValidationFactory.TYPES.values()) {
                    validator = ValidationFactory.getValidator(validationType, errors);
                    try {
                        validator.validate(p);
                    } catch (ValidationException e) {
                        Report.logErrorMessage("Failed to validate: " + validationType);                            
                        continue;
                    }
                }
            } 

然后在ValidationFactory中我有:

public final class ValidationFactory {

public enum TYPES {
    PROPERTIES, 
    PORTS
};

private ValidationFactory() {
}

public static AbstractValidator getValidator(TYPES validationType,
        ValidationErrors errors) {
    switch (validationType) {
    case PROPERTIES:
        return new PropertiesValidator(errors);
    case PORTS:
        return new PortRangeValidator(errors);
    default:
        return null;
    }
}}

此代码非常适用,并允许在以后添加新的验证器。虽然有一个相对较小的问题......

外部for循环遍历将传递给命令的参数列表,而内部for循环遍历可以进行验证的验证器列表。然而,根据参数,可能没有必要继续使用第二个验证器进行验证,第一个验证器可能已经完成了工作......所以,PropertiesValidator可能已经完成了所需的工作,现在没有必要调用第二个验证器,但无论如何它都会调用它。我想我可以使用一个变量来维护验证状态,然后如果已经完成它就可以跳过..两个验证器都扩展了一个AbstractValidator类,这个类就是最好的。

我希望在保持Factory模式结构的同时进行一次验证。我正在考虑加入某种委托类。我使用的是java 1.6,所以我不能打开字符串参数,这很好。

1 个答案:

答案 0 :(得分:1)

定义通用验证器,它将对所有验证器通用,并在属性和端口验证中定义特定验证。因此,现在通过将通用逻辑移动到通用验证器并在其他验证器中进行特定验证,没有重复验证。