我在一个文件夹中有3种不同类型的文件。每个文件都有相同的数据保存到员工表中。
文件类型:
我编写了3个单独的类,它们有两个方法,将filePath作为String参数并返回EmployeeVO
对象或List<EmployeeVO>
。
我想删除这些if else。
List<EmployeeVO> list ;
if(fileName.endsWith(".xml")){
list = XmlReader();
}else if(fileName.endsWith(".EXCEL")){
list = ExcelReader();
}else if(fileName.endsWith(".TXT")){
list = TxtReader();
}
答案 0 :(得分:3)
我认为你可以在这里使用Command模式。它可用于替换繁琐的开关/ if块,当您添加新选项时,这些块往往会无限增长。
另一种选择可能是Factory模式。你将if / switch包含在一个工厂里,它可以处理丑陋并隐藏大量的ifs。
当然你可以将两者结合起来。它只取决于您的偏好和您使用它的上下文。
顺便说一下:不要仅仅因为它们很花哨而使用模式在需要它们的地方使用它们。
答案 1 :(得分: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开启字符串。
答案 2 :(得分: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 :(得分:1)
在某些时候你需要做if / else逻辑,这是不可避免的。您可以将其移动到将具有派生类的EmployeeFileParser
类和将根据文件后缀确定要实例化的静态方法。
答案 4 :(得分:1)
您必须使用工厂模式。您的XML,EXCEL,TEXT读者应扩展您的基本抽象类/接口Reader。
根据传递的输入,您应该返回相应的Reader。
public interface Reader {
public void save(File file) throws Exception;
}
公共类ReaderFactory {
public Reader getReader(File file) {
Reader reader = null;
if xml then reader = new XMLReader();
else ....
}
}
答案 5 :(得分:1)
我会让每位读者决定它支持哪种格式。简而言之:
这样,您可以动态地为任何文件类型创建新的阅读器。
答案 6 :(得分:1)
在我看来,您可以使用责任链设计模式。一个非常好的例子,类似于你的情况,如下。
http://www.javacodegeeks.com/2012/09/chain-of-responsibility-design-pattern.html
希望它有所帮助。
更新: 当我看到答案时,我同意在某些情况下,一个简单的解决方案是最可取的,也是最易读的。虽然,如果您想使用设计模式设计代码,我会说责任链的优势在于它将消除代码中的所有if {} else {}语句。您只需要解析器和每个解析器的后继者。该解决方案可能具有一些性能缺点,但它将使代码更具可扩展性。在某些情况下,您需要进行交易,因此您应该考虑项目的要求。