对于这个需求,我可以在JAVA中使用什么设计模式

对于这个需求,我可以在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

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

文件类型:

  • XML
  • 胜过
  • .txt
  • 我已经编写了3个独立的类,它们有两个方法,以filePath作为字符串参数并返回
    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。谢谢你的帮助。