我正在开发一种产品,其中一个模块的职责是解析XML文件并将所需内容转储到数据库中。即使目前的要求只是解析XML文件,我仍希望以一种将来可以支持任何类型文件的方式设计解析模块。采用这种方法的原因是,我们正在为特定客户生产该产品,但计划在不久的将来将其出售给其他客户。当前客户端的生态系统中的所有系统都会生成和使用XML文件,但其他客户端可能并非如此。
到目前为止,我尝试了什么?(现在) 我想到的是基于策略模式的以下设计。我很快就用eclipse编写了代码以传达我的设计,因此,如果暂时忽略其他方面(如正确的异常处理方式),那将是很好的选择。
Parser:公开解析方法的策略接口。
public interface Parser<T> {
public T parse(String inputFile);
}
*使用泛型参数的原因是允许任何返回类型以及在编译时确保类型安全。
ProductDataXmlParser一个具体类,用于解析包含产品相关信息的product.xml文件。(使用XMLBeans)
public class ProductDataXmlParser implements Parser<ProductDataTYPE> {
public ProductDataTYPE parse(String inputFile) {
ProductDataTYPE productDataDoc = null;
File inputXMLFile = new File(inputFile);
try {
productDataDoc = ProductDataDocument.Factory.parse(inputXMLFile);
} catch(XmlException e) {
System.out.println("XmlException while parsing file : "+inputXMLFile);
} catch(IOException e) {
System.out.println("IOException while parsing file : "+inputXMLFile);
}
return productDataDoc.getProductData();
}
}
其中:ProductDataTYPE和ProductDataDocument是使用xsd和scomp命令生成的XMlBean POJO类。
未来
如果将来有要解析的product.txt文件,则可以定义自己的POJO(称为ProductData),该POJO将保存文件的所需内容。然后,我可以创建一个名为ProductDataFlatFileParser的具体类,该类实现解析器接口,并在解析文件后让parse方法为我填充ProductData POJO。
这种设计有意义吗?此设计是否有任何明显的缺陷?按照设计的观点,我允许具体类定义解析文件的算法,并让具体类决定填充数据的位置。设计似乎更依赖于域对象,而不是文件格式。这是坏事吗?任何有关如何改进设计的意见都将受到高度赞赏。