我应该选择哪种设计模式?装饰或责任链或其他东西

时间:2012-05-03 21:46:26

标签: design-patterns

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

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

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

  3. 非常欢迎任何建议。

    感谢。

1 个答案:

答案 0 :(得分:1)

你还没有给出那么多的背景。编程语言,您正在使用的XML解析模型,以及确定给定元素是否需要属性所需的上下文。

所以这是一种方法:

  • 假设Java
  • 使用一个抽象的名义对象集(Element和XMLDocument),它有点类似于DOM方法 - 用你的真实接口替换为XML树中的节点
  • 假设元素匹配逻辑是自包含的,这意味着您的逻辑可以根据Element本身的名称或其他属性来判断是否应该应用特定属性,并且不需要了解父项,子项,或祖先

顺便说一句 - 此代码尚未编译和测试。这只是该方法的一个例子。

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);  
        }
    }
}