gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:51:07 25 4
gpt4 key购买 nike

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

我在思考这个问题,我想我需要 Factory Patter Iterator Pattern 。在工厂传递文件:

ReaderFactory factory = new ReaderFactory("input.rdf");
//ReaderFactory factory = new ReaderFactory("input.xml");
Iterator<MyObject> iter = factory.getIterator();

所以工厂根据文件扩展名来选择要返回的迭代器的实现 - 这些是 rdf、xml 或 txt。然后使用这个迭代器我可以轻松地处理对象。添加添加新的文件扩展名以备将来阅读。

最佳答案

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

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 接口(interface)的类。一旦你为它实现了加载器,你就可以像这样使用它:

AssetManager assets = new AssetManager();
assets.addLoader(new JsonLoader(), "json");
assets.addLoader(new XmlLoader(), "xml");

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

您可以更进一步,将其设为单例,这样您就不必在每次要加载另一个文件时都重新注册不同的加载程序。

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

关于java - 在java中使用哪种设计模式来处理不同的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35139016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com