2012-05-03 8 views
0

XML文書のさまざまな要素にさまざまな属性を追加する必要があります。新しい属性を追加するロジックは非常に独立しています。私はどのデザインパターンを選ぶのですか?デコレートや責任の連鎖など

  1. デコ あまりにも多くのサブクラス:私は、私は、次のオプションを考え、私は私が使用すべきデザインパターンを疑問に思って、それらの属性を追加するには、クラスの束を作成します。私はXMLを装飾するために10から20のモジュールを持っているかもしれませんが、私は20のサブクラスが好きではありません。

  2. 責任の連鎖: 独立しているため、個々のモジュールがプロセス全体を終了させたくありません。

どのような提案も大歓迎です。

ありがとうございました。

答えて

1

あなたは、実際には多くの文脈を続けているわけではありません。プログラミング言語、使用しているXML解析モデル、および特定の要素に属性が必要かどうかを判断するために必要なコンテキスト。あなたの本当のインターフェースがにあるものは何でもと交換 -

  • Javaを前提としてい
  • は、それはDOMのアプローチに少し似ているオブジェクト(要素との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); 
     } 
    } 
} 
+0

私はjava XML Domを使用しています。私はXMLを操作するためのすべての情報を含む1つのコンテキストオブジェクトを持っています。 – BlueDolphin

関連する問題