14

両方のパターンを学習しましたが、これら 2 つのパターンの違いがわかりませんでした。

これらのパターンをいつ、どこで使用するか、シナリオがわかりません。

違いとユースケースを説明できる人はいますか?

4

6 に答える 6

25

主な違いは、戦略パターンは関連する行動の単一のグループをカプセル化するのに対し、訪問者パターンはそのような複数のグループをカプセル化することです。

  • 動作をカプセル化する必要がある場合は、戦略パターンを使用する必要があります。アルゴリズムのファミリがあり、実行時にそれらの中から選択する必要がある場合は、戦略パターンを使用する必要があります。これは非常によくあることです: interface にプログラムするたびに発生します。
  • ビジター パターンを使用して二重ディスパッチを実装する必要があります - 複数のオブジェクトに関して仮想化する必要があるアルゴリズムのグループがある場合。これは、実装がはるかに難しいため、あまり一般的ではありません。
于 2012-11-28T13:43:48.850 に答える
5

訪問者パターンの意図:

オブジェクト構造の要素に対して実行される操作を表します。Visitor を使用すると、操作対象の要素のクラスを変更せずに、新しい操作を定義できます。

次の場合は訪問者パターンを使用します。

  1. 構造にグループ化された異なるタイプのオブジェクトに対して同様の操作を実行する必要があります
  2. 多くの別個の無関係な操作を実行する必要があります。オブジェクト構造から操作を分離します
  3. オブジェクト構造を変更せずに新しい操作を追加する必要がある
  4. クラスの変更や派生を強制するのではなく、関連する操作を 1 つのクラスにまとめる
  5. ソースがない、またはソースを変更できないクラス ライブラリに関数を追加する

Visitor パターンは Object の既存のコードを変更せずに新しい操作を追加できる柔軟性を提供しますが、この柔軟性には欠点があります。

新しい Visitable オブジェクトが追加された場合、Visitor クラスと ConcreteVisitor クラスのコードを変更する必要があります。この問題に対処する回避策があります。リフレクションを使用すると、パフォーマンスに影響します。

詳細については、 oodesignの記事とソース作成の記事を参照してください。

戦略パターンの意図:

アルゴリズムのファミリーを定義し、それぞれをカプセル化し、交換可能にします。戦略により、アルゴリズムは、それを使用するクライアントとは独立して変更できます。

戦略を使用すると、オブジェクトの内臓を変更できます。

詳細については、以下の SE に関する質問を参照してください。

戦略パターンの実例

于 2016-06-03T10:16:54.087 に答える
3

訪問者パターンは、オブジェクト階層をトラバースし、印刷やレポートなどの機能を提供するために使用されます。これを使用して、さまざまな形式 (テキスト/HTML) を提供し、各形式に 1 つずつ、複数の訪問者を記述してオブジェクト階層を印刷しました。階層内のオブジェクトは訪問可能オブジェクトです。

戦略パターンは、入力に基づいて特定の論理パスを選択するために使用されます。Authorization古典的な例は、 HTTP ヘッダーの値に基づいて、NTLM/Negotiate/Basic などのさまざまな認証戦略が選択されて実行される認証フィルターです。フィルタは AuthenticationStrategy インターフェースへの参照を保持します。受信リクエストに基づいて、特定の認証戦略が選択され、この参照に割り当てられます。その後のコードは、使用されている正確な戦略を知る必要はありません。

于 2012-11-28T13:43:22.533 に答える