【问题标题】:Design patterns for validating a file用于验证文件的设计模式
【发布时间】:2010-01-14 00:27:06
【问题描述】:

我们必须验证一个包含各种配置参数的 CSV 文件。是否有任何标准设计模式可以进行此类验证。

更多细节:

  • 有不同类型的记录 - 每种都有自己的验证逻辑
  • 某些记录交叉引用其他记录
  • 记录的顺序有规定
  • 对重复记录的资格有规定

【问题讨论】:

  • 是的,这种模式被称为“标记语言”——XML 就是一个很好的例子——它在 JAVA 中被广泛使用。失败了,您必须编写复杂的 CSV 解析器 - 这不好玩。
  • 遗憾的是我们被 CSV 格式卡住了

标签: java design-patterns validation file-upload


【解决方案1】:

您可以使用Strategy 模式来验证记录。有一个抽象基类来表示一个记录,你可以使用 Factory Method,或 Simple Factory 来创建各种 Record 类型的具体实例。
您的规范不完整。这是实现策略模式的代码示例 对你的记录有一个简单的假设。

接口验证器 {
     // 因为不清楚哪些属性对记录很重要,
     // 这需要一个 Record 的实例。
     // 修改接受Record的相关属性
     公共布尔验证(记录 r);
 }

 类 ConcreteValidator 实现 Validator {
      // 实现验证逻辑
 }

// 实现 Comparable 以便在比较记录的规则中使用它
抽象类 Record 实现 Comparable {
    受保护的验证器 v;
    抽象无效 setValidator(Validator v);
    公共布尔isValid(){
        返回 v.validate(this);
    }
}

类 ConcreteRecord 扩展记录 {
   // 或者在构造过程中接受一个Validaor
   // 通过提供一个接受 Validator 类型的构造函数
   // 即 ConcreteRecord(Validator v) ...
    无效 setValidator(验证器 v){
        这个.v = v;
    }

    // Comparable Interface 方法的实现
    public int compareTo(final Record o) {... }
}

公共类测试{
    公共静态无效主要(字符串[]参数){
        // 将读取的记录存储在列表中(允许重复)
        列表 记录列表 = 新的 ArrayList();
        // 这很简单。您的记录创建模式可能是
        // 更复杂,你可以使用工厂方法
        //(或简单工厂)用于创建 ConcreteRecord
        记录 r = new ConcreteRecord();
        r.setValidtor(new ConcretedValidator());
        如果(r.isValid()){
            // 只存储有效记录
            记录列表.add(r);
        }

       // 对存储在 recordList 中的 Records 做进一步处理
    }

}

【讨论】:

    【解决方案2】:

    模板模式可能会有所帮助: http://en.wikipedia.org/wiki/Template_method_pattern

    一般而言,您为您的验证设置了一个脚手架,然后将算法交给知道如何处理各个点的细节的委托。

    【讨论】:

      【解决方案3】:

      我知道我的一个朋友使用JBOSS DROOLS 来验证此类文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 2010-09-07
        • 2010-09-19
        • 1970-01-01
        相关资源
        最近更新 更多