2017-08-26 106 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; 
    } 
}