0

我需要为 XML 文档中的各种元素添加各种属性,添加新属性的逻辑非常独立。我将创建一堆类来添加这些属性,我想知道我应该使用哪种设计模式,我想到了以下选项:

  1. 装饰器 子类太多。我可能有 10 到 20 个模块来装饰 XML,但我不喜欢 20 个子类。

  2. 责任链:我不希望单个模块完成整个过程,因为它们是独立的。

任何建议都非常受欢迎。

谢谢。

4

1 回答 1

1

你实际上并没有给出太多的背景信息。编程语言,您正在使用哪种 XML 解析模型,以及需要多少上下文来确定给定元素是否需要属性。

所以这是一种方法:

  • 假定 Java
  • 使用与 DOM 方法有点相似的抽象概念对象集(Element 和 XMLDocument) - 替换为 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);  
        }
    }
} 
于 2012-05-03T22:26:48.383 回答