我有一个简单的任务,可以读取来自不同文件( xml、rdf、txt )的不同结构的信息,并将其放入某些POJO自定义对象(MyObject)中。因此,我想知道使用哪种设计模式来使我的代码具有更好的设计。
我思考这个问题,我认为我需要http://www.tutorialspoint.com/design_pattern/factory_pattern.htm和http://www.tutorialspoint.com/design_pattern/iterator_pattern.htm。在工厂上传递文件:
ReaderFactory factory = new ReaderFactory("input.rdf");
//ReaderFactory factory = new ReaderFactory("input.xml");
Iterator<MyObject> iter = factory.getIterator();因此,工厂基于文件扩展名选择迭代器要返回的实现--这些实现读取rdf、xml或txt。然后,使用这个迭代器,我可以轻松地处理对象。添加新的文件扩展名在未来阅读。
发布于 2016-02-01 20:05:05
下面是一个如何使用Factory和Strategy的示例。创建一个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接口。一旦为它实现了加载器,就可以这样使用它:
AssetManager assets = new AssetManager();
assets.addLoader(new JsonLoader(), "json");
assets.addLoader(new XmlLoader(), "xml");
Iterator<MyObject> iter = assets.load("input.xml");您可以更进一步,使它成为一个Singleton,这样您就不必每次需要加载另一个文件时都重新注册不同的加载器。
这种方法为以后支持新的文件类型提供了更大的灵活性。它确实增加了代码的复杂性,但是如果您计划添加对多个文件类型的支持,这可能是值得的。
发布于 2016-02-01 20:11:32
将您的解决方案视为设计模式比将设计模式视为您的解决方案要好。
如果您已经考虑过这一点,那么我认为,策略模式可能更适合您的情况。
我假设您读取输入文件的方式将保持不变,而不管文件格式如何。但是,您可能希望根据文件的内容构建一个POJO。
例如:
interface FileProcessor {
public POJO process(BufferedReader br);
}可以跨类实现相同的接口。
class RDFFileProcessor implements FileProcessor {
public POJO process(BufferedReader br) {
// do your processing logic for rdf file content.
return POJO;
}
}发布于 2016-02-02 13:07:37
我觉得你不应该再尝试重新发明轮子了。至少使用已经解决了这个问题的RDF4j或耶娜来读取RDF。我推荐RDF4j而不是Jena,它更容易使用,但两者都能正常工作。
然后,您可以使用类似于平托 (免责声明,我是作者)的东西将解析的文件映射到POJO中,类似于Jackson & JSON。
RDF4j和Jena都有关于如何使用解析器的好文档。我知道RDF4j会根据文件扩展名选择正确的解析器,这就是您要说的。
节省你自己的时间和精力,使用一个库为你做到这一点,实际上集中在你的应用程序。
https://stackoverflow.com/questions/35139016
复制相似问题