首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中使用哪种设计模式来处理不同的文件?

在java中使用哪种设计模式来处理不同的文件?
EN

Stack Overflow用户
提问于 2016-02-01 19:47:11
回答 3查看 6.6K关注 0票数 2

我有一个简单的任务,可以读取来自不同文件( xml、rdf、txt )的不同结构的信息,并将其放入某些POJO自定义对象(MyObject)中。因此,我想知道使用哪种设计模式来使我的代码具有更好的设计。

我思考这个问题,我认为我需要http://www.tutorialspoint.com/design_pattern/factory_pattern.htmhttp://www.tutorialspoint.com/design_pattern/iterator_pattern.htm。在工厂上传递文件:

代码语言:javascript
复制
ReaderFactory factory = new ReaderFactory("input.rdf");
//ReaderFactory factory = new ReaderFactory("input.xml");
Iterator<MyObject> iter = factory.getIterator();

因此,工厂基于文件扩展名选择迭代器要返回的实现--这些实现读取rdf、xml或txt。然后,使用这个迭代器,我可以轻松地处理对象。添加新的文件扩展名在未来阅读。

EN

回答 3

Stack Overflow用户

发布于 2016-02-01 20:05:05

下面是一个如何使用FactoryStrategy的示例。创建一个AssetManager (工厂),注册不同的AssetLoader(策略)以及它们处理的文件扩展名。在运行时,工厂根据文件扩展名选择要使用的策略。

代码语言:javascript
复制
public interface AssetLoader
{
    public Object load(String name) throws Exception;
}

public class AssetManager
{
    private HashMap<String, AssetLoader> loaders = new HashMap<>();

    public void addLoader(AssetLoader loader, String extension)
    {
        loaders.put(extension, loader);
    }

    @SuppressWarnings("unchecked")
    public <T> T load(String name)
    {
        int i = name.lastIndexOf('.');
        if (i == -1)
            throw new RuntimeException("\"" + name + "\" has no extension, and so has no associated asset loader");

        String extension = name.substring(i+1);
        AssetLoader loader = loaders.get(extension);
        if (loader == null)
            throw new RuntimeException("No loader registered for \"." + extension + "\" files");
        try
        {
            return (T) loader.load(name);
        }
        catch(ClassCastException e)
        {
            throw new RuntimeException("\"" + name + "\" could not be loaded as the expected type");
        }
        catch(Exception e)
        {
            throw new RuntimeException("Failed to load " + name, e);
        }
    }
}

您所要做的就是创建类,为您想要支持的特定扩展实现AssetLoader接口。一旦为它实现了加载器,就可以这样使用它:

代码语言:javascript
复制
AssetManager assets = new AssetManager();
assets.addLoader(new JsonLoader(), "json");
assets.addLoader(new XmlLoader(), "xml");

Iterator<MyObject> iter = assets.load("input.xml");

您可以更进一步,使它成为一个Singleton,这样您就不必每次需要加载另一个文件时都重新注册不同的加载器。

这种方法为以后支持新的文件类型提供了更大的灵活性。它确实增加了代码的复杂性,但是如果您计划添加对多个文件类型的支持,这可能是值得的。

票数 6
EN

Stack Overflow用户

发布于 2016-02-01 20:11:32

将您的解决方案视为设计模式比将设计模式视为您的解决方案要好。

如果您已经考虑过这一点,那么我认为,策略模式可能更适合您的情况。

我假设您读取输入文件的方式将保持不变,而不管文件格式如何。但是,您可能希望根据文件的内容构建一个POJO。

例如:

代码语言:javascript
复制
interface FileProcessor {
 public POJO process(BufferedReader br);
}

可以跨类实现相同的接口。

代码语言:javascript
复制
class RDFFileProcessor implements FileProcessor {
 public POJO process(BufferedReader br) {
  // do your processing logic for rdf file content.
  return POJO;
 }
}
票数 4
EN

Stack Overflow用户

发布于 2016-02-02 13:07:37

我觉得你不应该再尝试重新发明轮子了。至少使用已经解决了这个问题的RDF4j耶娜来读取RDF。我推荐RDF4j而不是Jena,它更容易使用,但两者都能正常工作。

然后,您可以使用类似于平托 (免责声明,我是作者)的东西将解析的文件映射到POJO中,类似于Jackson & JSON。

RDF4j和Jena都有关于如何使用解析器的好文档。我知道RDF4j会根据文件扩展名选择正确的解析器,这就是您要说的。

节省你自己的时间和精力,使用一个库为你做到这一点,实际上集中在你的应用程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35139016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档