1

あるアプリケーションでは、私は多くの異なるオブジェクトを持っています。たとえば、正方形、円など、さまざまな形があります--->些細な例でごめんなさい。

このすべてのオブジェクトを使用して、xml、txt、htmlなどのさまざまなタイプのドキュメントを作成します(例:すべてのオブジェクト(形状)ツリーをスキャンして、xmlファイルを生成します。

私が考えた自然なアプローチはビジターパターンです、私は試しました、そしてそれはうまくいきます:-)-すべてのオブジェクトはIVisitorインターフェースを受け入れる1つのビジターメソッドを持っています。-作成したい種類ごとに1人の具体的な訪問者がいます:(、、XmlVisitorなどTxtVisitor)。すべての訪問者には、あらゆる種類のオブジェクトに対して1つのメソッド「訪問」があります。

私の疑問は...オブジェクトがたくさんあるとスケーリングがうまくいかないようです...論理的な観点からは問題ありません。具体的なビジターに新しい形状とメソッドを追加するだけです。それで全部です。

どう思いますか ?代替案は可能ですか?

4

3 に答える 3

1

最も心配なのは、さまざまな種類のオブジェクトと照合していることであり、オブジェクトタイプが追加されるにつれて、パフォーマンスが低下することを心配しているように思われます。ただし、それについて心配する必要はないと思います。ビジターパターンのパフォーマンスは、仮想テーブルルックアップに基づいているため、オブジェクトやビジターの潜在的な数に実際には影響されません。渡されたオブジェクトには、 (へのリンク)呼び出されるべきメソッド。

したがって、ビジターパターンは、間接アクセスでは比較的コストがかかりますが、この点でスケーラブルです。

于 2012-11-06T15:58:10.853 に答える
1

ビジターパターンを正しく実装し、その結果、ダブルディスパッチメカニズムも実装したと思います。新しい形状や訪問者を追加する場合に一連のメソッドを追加する必要があると「スケーリングがうまくいかない」と考える場合、それはパターンの単なる副作用です。一部の人々は、この「メソッドの爆発的増加」を有害であると見なし、「決定マトリックス」オブジェクトを持つなど、別の実装を選択します。特にこの例では、DDアプローチが進むべき道であり、新しい要件を追加するときに新しいメソッドを追加する(つまり、新しい形状が追加されるか、追加するときに新しいvisit *メソッドを追加する)ので、実際にはうまく拡張できると思います。新しいドキュメントタイプが必要なため、新しいビジタークラス)。

HTH

于 2012-11-06T20:04:26.147 に答える
0

私はあなたが持っていると信じています:

  1. クラス階層(このShape例ではs)と
  2. クラス階層の操作(例ではexportXMLexportToHTMLなど)

何が変わる可能性が高いかを考慮する必要があります-

  1. クラス階層が多かれ少なかれ固定されているが、将来さらに操作を追加したい場合は、Visitorパターンを選択する必要があります。ビジターパターンを使用すると、既存のクラス階層に触れることなく、操作(JSONエクスポートなど)を追加できます。

  2. OTOH操作が多かれ少なかれ固定されているが、より多くのShapeオブジェクトを追加できる場合は、通常の継承を使用する必要があります。などのShapeExportメソッドを持つインターフェースを定義します。すべてのShapeにそのインターフェースを実装させます。これで、既存のコードに触れることなく、同じインターフェイスを実装する新しいShapeを追加できます。exportToXMLexportToHTML

于 2012-11-07T08:10:45.827 に答える