2

我在一个文件夹中有 3 种不同类型的文件。每个文件都有相同的数据保存到员工表中。

文件类型:

  1. XML
  2. Excel
  3. 。文本

我编写了 3 个单独的类,它们有两种方法,将 filePath 作为 String 参数并返回EmployeeVOObject 或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();
 }
4

7 回答 7

3

我认为您可以在这里使用命令模式。它可用于替换繁琐的 switch / if 块,这些块在您添加新选项时往往会无限增长。

另一种选择可能是工厂模式。您将 if / switch 包含在一个工厂中,该工厂负责处理丑陋并隐藏大量 ifs。

当然,您可以将两者结合起来。这仅取决于您的偏好和使用它的环境。

顺便说一句:不要仅仅因为它们花哨就使用它们,在你需要它们的地方使用它们。

于 2012-11-15T15:24:20.630 回答
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 中的字符串。

于 2012-11-15T15:28:48.997 回答
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();
于 2012-11-15T15:28:58.560 回答
1

在我看来,您可以使用责任链设计模式。下面是一个非常好的示例,类似于您的情况。

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

希望能帮助到你。

更新:当我在看答案时,我同意在某些情况下,一个简单的解决方案也是最可取和最易读的。不过,如果您想使用设计模式来设计代码,我会说责任链的优势在于它可以消除代码中的所有 if{}else{} 语句。您只需要解析器和每个解析器的后继者。该解决方案可能存在一些性能缺点,但它会使代码更具可扩展性。在某些情况下,您需要进行交易,因此您应该考虑项目的要求。

于 2012-11-15T15:59:39.383 回答
1

You have to use the Factory Pattern. Your XML, EXCEL, TEXT Readers should extend your base abstract class / interface Reader.

Based on the input passed, you should return the corresponding Reader.

public interface Reader {

public void save(File file) throws Exception;

}

public class ReaderFactory {

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

}

于 2012-11-15T15:30:09.540 回答
1

在某些时候,您将需要执行 if/else 逻辑,这是不可避免的。您可以将其移至EmployeeFileParser具有派生类和静态方法的类,该静态方法将根据文件后缀确定要实例化的方法。

于 2012-11-15T15:25:09.457 回答
1

我会让每个读者决定它支持什么格式。简而言之:

  • 创建一个超级阅读器类,如果需要,将特殊类(ExcelReader 等)包装在您自己的类中
  • 在超类中添加一个抽象的 canProcess(String filename),并在您的专门类中实现它(它应该确定专门的 readerclass 是否可以处理文件)
  • 在超类中创建一个静态方法,该方法循环读取器类并确定要使用的类,并使用它

这样,您可以动态地为任何文件类型创建新的阅读器。

于 2012-11-15T15:33:26.920 回答