2017-08-26 139 views
0

我有以下输入:这是一个很好的例子为策略模式

  1. CSV文件
  2. 的语法规则的数组。语法规则基本上是元数据,它告诉我每列数据类型
    应该是什么。

输出将返回给我一个有任何错误的记录列表。所以,如果专栏应该是一个日期,但我给了错误的格式。我会返回这些行。

CSV文件将是这样的:

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

元数据:

column:first_name 
type:string 

column:dob 
type:date 

我在想,如果策略模式将是正确的选择。我正在考虑根据文件注入适当的语法(元数据)。我有多个要验证的文件。

+0

你所指的可能是普通的旧构图而不是* Strategy *模式。 – CKing

+0

@MindGame - 策略模式讨论了可互换的算法族,这些算法一次只能应用(附加)到上下文中。在现在的问题陈述中,如果规则被设想为算法,它们同时应用于不同的列并且不可互换。如果同一列的规则在两个状态之间没有变化而发生变化,那么该部分可以实施为策略,否则不是策略的合适候选人。 –

+0

@KedarTokekar谢谢你的解释。你说的对。那么在这种情况下什么设计模式会很好? – MindGame

回答

0

此问题需要验证处理程序(用于您的语法规则)。考虑更低的复杂度和预期的扩展,我不觉得需要任何特定的设计模式。我会建议遵循简单的OO方法。另外,根据预期的动态行为,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; 
    } 
}