对于这个需求,我可以在JAVA中使用什么设计模式
我在一个文件夹中有3种不同类型的文件。每个文件都有相同的数据保存到Employee表中 文件类型:对于这个需求,我可以在JAVA中使用什么设计模式,java,design-patterns,Java,Design Patterns,我在一个文件夹中有3种不同类型的文件。每个文件都有相同的数据保存到Employee表中 文件类型: XML 胜过 .txt 我已经编写了3个独立的类,它们有两个方法,以filePath作为字符串参数并返回EmployeeVO对象或列表 我想删除这些,如果其他 List<EmployeeVO> list ; if(fileName.endsWith(".xml")){ list = XmlReader(); }else if(fileName.endsWith(".E
EmployeeVO
对象或列表
我想删除这些,如果其他
List<EmployeeVO> list ;
if(fileName.endsWith(".xml")){
list = XmlReader();
}else if(fileName.endsWith(".EXCEL")){
list = ExcelReader();
}else if(fileName.endsWith(".TXT")){
list = TxtReader();
}
列表;
if(fileName.endsWith(“.xml”)){
list=XmlReader();
}else if(fileName.endsWith(“.EXCEL”)){
list=ExcelReader();
}else if(fileName.endsWith(“.TXT”)){
list=TxtReader();
}
我认为您可以使用这里的模式。它可以用来取代笨重的开关/if块,当您添加新选项时,这些开关/if块会无限增长
另一种选择可能是模式。你把你的if/开关放在一个工厂里,这个工厂负责处理丑陋的事物并隐藏大量的if
当然你可以把两者结合起来。这只取决于您的偏好和使用它的环境
顺便说一句:不要仅仅因为图案别致就使用它们。在你需要的地方使用它们。在某个时候你需要做if/else逻辑,这是不可避免的。您可以将其移动到一个EmployeeFileParser
类,该类将具有派生类和一个静态方法,该方法将根据文件后缀确定实例化哪个类。有时最简单的解决方案是最好的,也是最可读的:
switch(FilenameUtils.getExtension(fileName).toUpperCase()) {
case "XML":
return XmlReader();
case "EXCEL":
return next ExcelReader();
case "TXT":
return new TxtReader();
default:
//...
}
我正在使用()并从Java 7打开字符串。您可以使用一种策略:
// 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();
//保持从读卡器到扩展的关联的类字段
映射读取器=新的HashMap();
//配置(例如bean初始化)
put(“xml”,xmlReader);
阅读器。put(“xls”,excelReader);
readers.put(“txt”,txtReader);
//执行将类似于:
List List=readers.get(文件扩展名).readList();
您必须使用出厂模式。XML、EXCEL和文本阅读器应该扩展基本抽象类/接口阅读器
根据传递的输入,您应该返回相应的读取器
公共接口阅读器{
public void save(File file) throws Exception;
}
公共类ReaderFactory{
public Reader getReader(File file) {
Reader reader = null;
if xml then reader = new XMLReader();
else ....
}
}我会让每个读者决定它支持什么格式。简言之:
- 创建一个超级阅读器类,如果需要,将特殊类(ExcelReader等)包装到您自己的类中
- 在超类中添加抽象canProcess(字符串文件名),并在专用类中实现它(它应该确定专用readerclass是否可以处理该文件)
- 在超类中创建一个静态方法,该方法循环读卡器类并确定要使用的类,然后使用它
这样,您就可以动态地为任何文件类型创建新的读卡器 在我看来,您可以使用责任链设计模式。下面是一个非常好的例子,与您的案例类似
希望能有帮助
更新:
当我看到答案时,我同意在某些情况下,简单的解决方案是最可取的,也是最具可读性的。尽管如此,如果您想使用设计模式设计代码,我想说责任链的优点是它将消除代码中的所有if{}else{}语句。您只需要解析器和每个解析器的后续解析器。该解决方案可能有一些性能方面的缺点,但它会使代码更具可扩展性。在某些情况下,您需要进行交易,因此您应该考虑项目的要求。这些文件名是否真的以.EXCEL
结尾?是否可以编写示例代码并删除if/else。谢谢你的帮助。