2012-11-15 44 views
2

我在文件夾中有3種不同類型的文件。每個文件都有相同的數據保存到員工表中。我可以在JAVA中使用哪種設計模式來滿足此要求

文件類型:

  1. XML
  2. Excel中
  3. .TXT

我已經寫了3個獨立的類具有兩個方法,採取了文件路徑作爲字符串參數和返回EmployeeVO對象或List<EmployeeVO>

我想刪除這些如果其他。

List<EmployeeVO> list ; 
if(fileName.endsWith(".xml")){ 
    list = XmlReader(); 
}else if(fileName.endsWith(".EXCEL")){ 
    list =  ExcelReader(); 
}else if(fileName.endsWith(".TXT")){ 
    list =  TxtReader(); 
} 
+0

這些文件名是否真的以'.EXCEL'結尾? –

回答

2

你可以使用一種策略:

// class field holding association from readers to extension 
Map<String, Reader> readers = new HashMap<String, Reader>(); 

// configuration (bean initialization for example) 
readers.put("xml", xmlReader); 
readers.put("xls", excelReader); 
readers.put("txt", txtReader); 

// execution would be something like: 
List<EmployeeVO> list = readers.get(fileExtension).readList(); 
3

我認爲你可以在這裏使用Command模式。它可以用來替代繁瑣的開關/如果塊添加新選項時會無限增長。

另一種選擇可能是Factory模式。你把你的if /開關放在一個能夠照顧醜陋的工廠裏面,並且隱藏豐富的ifs。

當然,你可以結合兩個。它僅取決於您的偏好和使用它的環境。

順便說一句:不使用模式,僅僅因爲他們是看中使用它們,你需要他們

1

在某些時候,如果/ else邏輯需要做,這是不可避免的。您可以將它移動到一個EmployeeFileParser類,該類將具有派生類和一個靜態方法,該類將根據文件後綴確定要實例化哪個類。

2

有時,最簡單的解決方案是最好的,最可讀:

switch(FilenameUtils.getExtension(fileName).toUpperCase()) { 
    case "XML": 
     return XmlReader(); 
    case "EXCEL": 
     return next ExcelReader(); 
    case "TXT": 
     return new TxtReader(); 
    default: 
     //... 
} 

我使用FilenameUtils.getExtension()source),並從Java 7.串行中的開關

1

您必須使用工廠模式。您的XML,EXCEL,TEXT讀者應該擴展您的基本抽象類/接口讀取器。

根據通過的輸入,您應該返回相應的Reader。

公共接口讀卡器{

public void save(File file) throws Exception; 

}

公共類ReaderFactory {

public Reader getReader(File file) { 
    Reader reader = null; 
    if xml then reader = new XMLReader(); 
    else .... 
} 

}

1

,我會讓每個讀者決定什麼格式支持。總之:

  • 創建一個超級閱讀器類,如果需要的話,在你自己的類包裝的specialed類(ExcelReader等)
  • 在超類添加一個抽象canProcess(字符串文件名),並執行它在你的專業類(它應該確定專門readerclass可以處理的文件)
  • 創建哪些循環的讀取器類,並確定一個使用超類的靜態方法,並使用它

這樣,您可以爲任何文件類型d創建新的讀取器ynamically。

1

在我看來,你可以使用責任鏈設計模式。與您的情況類似,一個非常好的示例如下。

http://www.javacodegeeks.com/2012/09/chain-of-responsibility-design-pattern.html

希望它能幫助。

更新: 正如我在觀看答案,我同意在某些情況下,一個簡單的解決方案是最好的和最易讀的。雖然,如果您想使用設計模式設計您的代碼,我會說責任鏈的優勢在於它會消除代碼中的所有if語句。您只需要解析器和每個解析器的後繼者。該解決方案可能會有一些性能下降,但它會使代碼更加可擴展。在某些情況下,您需要進行交易,因此您應該考慮您的項目需求。

+0

您可以寫一個示例代碼並刪除if/else。謝謝你的幫助。 – HakunaMatata

相關問題