我需要为 XML 文档中的各种元素添加各种属性,添加新属性的逻辑非常独立。我将创建一堆类来添加这些属性,我想知道我应该使用哪种设计模式,我想到了以下选项:
装饰器 子类太多。我可能有 10 到 20 个模块来装饰 XML,但我不喜欢 20 个子类。
责任链:我不希望单个模块完成整个过程,因为它们是独立的。
任何建议都非常受欢迎。
谢谢。
我需要为 XML 文档中的各种元素添加各种属性,添加新属性的逻辑非常独立。我将创建一堆类来添加这些属性,我想知道我应该使用哪种设计模式,我想到了以下选项:
装饰器 子类太多。我可能有 10 到 20 个模块来装饰 XML,但我不喜欢 20 个子类。
责任链:我不希望单个模块完成整个过程,因为它们是独立的。
任何建议都非常受欢迎。
谢谢。
你实际上并没有给出太多的背景信息。编程语言,您正在使用哪种 XML 解析模型,以及需要多少上下文来确定给定元素是否需要属性。
所以这是一种方法:
顺便说一句 - 此代码尚未编译和测试。这只是该方法的一个说明。
public interface ElementManipulator {
public void manipulateElement(Element elem);
}
public class AManipulator implements ElementManipulator {
public void manipulateElement(Element elem) {
if (elem.name == "something-A-cares-about") {
//add A's attribute(s) to elem
}
}
}
public class BManipulator implements ElementManipulator {
public void manipulateElement(Element elem) {
if (elem.name == "something-B-cares-about") {
//add B's attribute(s) to elem
}
}
}
public class XMLManipulator {
ArrayList<? extends ElementManipulator> manipulators;
public XMLManipulator () {
this.manipulators = new ArrayList<? extends ElementManipulator>();
this.manipulators.add(new AManipulator());
this.manipulators.add(new BManipulator());
}
public void manipulateXMLDocument(XMLDocument doc) {
Element rootElement = doc.getRootElement();
this.manipulateXMLElement(rootElement);
}
/**
* Give the provided element, and all of it's children, recursively,
* to all of the manipulators on the list.
*/
public void manipulateXMLElement(Element elem) {
foreach (ElementManipulator manipulator : manipulators) {
manipulator.manipulateElement(elem);
}
ArrayList<Element> children = elem.getChildren();
foreach(Element child: children) {
this.manipulateXMLElement(child);
}
}
}