5

Java オブジェクト モデルXMLに変換するために、次の設計を使用しています。

さまざまなタイプのオブジェクト (たとえば、プリミティブ タイプ、コレクション、null など)に対して、指定されたタイプに関して適切に機能する独自のconverterをそれぞれ定義します。このようにして、巨大な if-else-then 構造にコードを追加することなく、簡単に拡張できます。

コンバーターは、オブジェクトが変換可能かどうかをテストする方法と、優先順位を使用して選択されます。優先順位は重要であるため、 aListは POJO コンバーターによって変換されないとします。たとえそれ自体が変換可能であっても、コレクション コンバーターを使用する方が適切です。

それはどんなデザインパターンですか?

コマンドパターンとの類似点しか思い浮かびません。

4

1 に答える 1

5

まず、やりたいことを分類してみてください (XML ファイルを出力する、何かを何かに変換する)。設計パターンは 3 つのカテゴリに分類されます。

この場合、xml ライターといくつかのコンバーターの 2 種類のクラスがあります。xml ライターは基本的にビルダーです (ファイルを作成します)。

XmlWriter writer = new XmlWriter();
writer.writeHeader();
for (Item item : xmlitems) {
    writer.write(convert(item));
}
writer.close();

現在、クラスから xml への実際の変換は、いくつかのクラスによって行われます。クラスをテストし、それらを特定のコンバーターに転送するメソッドがあると述べています。このクラスは、何かの新しいインスタンスを作成すると主張できるため、作成パターンに分類されます。

IMO に適した 3 種類のパターンがあります。

  • オブジェクトの具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトを作成するためのインターフェイスを提供する抽象ファクトリ パターン。

  • 同じ構築プロセスで異なる表現を作成できるように、複雑なオブジェクトの構築をその表現から分離するビルダー パターン。

  • クラスがインスタンス化をサブクラスに延期できるようにするファクトリ メソッド パターン。

出典:ウィキペディア

私によると、どちらかが適切です。実装が似ているため、ビルダー パターンが適切です。

public interface Converter {
    void convert(Item item);
    XmlTextNode getResult(); // get xml code
}

つまり、クラスに何かを与えると、結果が得られます。

インスタンス化を他のクラス(あなたが話したリダイレクトメソッド)に任せるので、ファクトリパターンは適切です

public XmlTextNode convert(Item item) {
    if (item instanceof ConcreteItem) {
        return new ConcreteConverter(item).getResult();
    }
    throw new InvalidOperationException("Invalid convert type");
}

いずれの場合も、返されるアイテムの実際のタイプは重要ではありません。「パターンを定義」する場所によって少し異なります。型を切り替えるメソッドにあるのか、それとも実際の作成/コンバーター クラスにあるのか。

繰り返しますが、私はこの事件の専門家ではありません。

于 2012-09-25T15:21:21.730 に答える