我可以在JAVA中使用哪种设计模式来满足此要求

时间:2012-11-15 15:23:20

标签: java design-patterns

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

文件类型:

  1. XML
  2. Excel中
  3. .txt的
  4. 我编写了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();
     }
    

7 个答案:

答案 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)

我会让每位读者决定它支持哪种格式。简而言之:

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

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

答案 6 :(得分:1)

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

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

希望它有所帮助。

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