这是战略模式的一个好例子

时间:2017-08-26 04:08:26

标签: csv design-patterns strategy-pattern

我有以下输入:

  1. CSV文件
  2. 一系列语法规则。语法规则是
        基本上元数据告诉我每列数据类型是什么     应该是。
  3. 输出会返回给我一个有错误的记录列表。因此,如果列应该是一个日期,但我给出了错误的格式。我会返回那些行。

    csv文件是这样的:

    inp.upper() == capitals[rand].upper()
    

    元数据:

    first_name,last_name,dob,age,
    john,doe,2001/05/02
    mary,jane,1968/04/01
    

    我想知道战略模式是否是正确的选择。我正在考虑根据文件注入正确的语法(元数据)。我有多个要验证的文件。

1 个答案:

答案 0 :(得分:0)

此问题需要验证处理程序(用于语法规则)。考虑到较低的复杂性级别和预期的扩展,我觉得不需要任何特定的设计模式。我建议遵循简单的面向对象方法。或者,根据预期的动态行为,可以通过将每个混凝土处理器放入链(COR)中来合并COR。将每个令牌传递到一个链中,以便为链中的处理程序提供机会,直到它被处理完毕。

public class Extractor {
    public static void main(String[] args) {
        // PREPARE TEMP_MAP_HANDLERS<Type,Handler>
        Map<String, Handler> handlers = new HashMap<>();
        handlers.put("FIRST_NAME",new NAMEHandler());
        handlers.put("LAST_NAME",new NAMEHandler());
        handlers.put("DOB",new DOBHandler());
        handlers.put("AGE",new AGEHandler());
        // READ THE HEADER
        String header = "first_name,last_name,dob,age";// SAMPLE READ HEADER
        // PREPARE LOOKUP<COL_INDEX, TYPE_HANDLER> 
        Map<Integer, Handler> metaHandlers = new HashMap<>();
        String[] headerTokens = header.split(",");
        for (int i = 0; i < headerTokens.length; i++) {
            metaHandlers.put(i, handlers.get(headerTokens[i].toUpperCase()));
        }
        // DONE WITH TEMP HANDLER LOOKUP 
        // READ ACTUAL ROWS
        // FOR EACH ROW IN FILE
        String row = "joh*n,doe,2001/05/02";
        String[] rowTokens = row.split(",");
        for (int i = 0; i < rowTokens.length;i++) {
            System.out.println(rowTokens[i]);
            Handler handler = metaHandlers.get(i);
            if (!handler.validate(rowTokens[i])){
                // REPORT WRONG DATA
                System.out.println("Wrong Token" + rowTokens[i]);
            }
        }
    }
}
abstract class Handler {
    abstract boolean validate (String field);
}

class NAMEHandler extends Handler{
    @Override
    boolean validate(String field) {
        // Arbitrary rule - name should not contain *
        return !field.contains("*");
    }
}

class DOBHandler extends Handler{
    @Override
    boolean validate(String field) {
        // Arbitrary rule - contains /
        return field.contains("/");
    }
}

class AGEHandler extends Handler{
    @Override
    boolean validate(String field) {
        // TODO validate AGE
        return true;
    }
}