2012-11-15 39 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

相关问题