17

数日前にSOでここで尋ねた別の質問のために、私はこの質問を提起しています。
特定の問題を解決する必要がありましたが、2 つの返信を受け取った後、2 つのパターンがその問題 (および他の同様の問題) を解決するのに役立つことに気付きました。

  1. 責任の連鎖
  2. ストラテジー

私の質問は:

これらのパターンの違いは正確には何ですか?

4

6 に答える 6

32

それらは非常に異なります。

戦略とは、アルゴリズムのさまざまな実装、またはいくつかの共通の依存関係を持ついくつかのアルゴリズムまたはロジックの一部を提供するために使用できる汎用インターフェースを持つことです。

たとえば、 (マージソート、クイックソート、バブルソート)CollectionSorterをサポートできます。SortingStrategyそれらはすべて同じインターフェースと目的を持っていますが、異なることを行うことができます。

場合によっては、内部の戦略を決定することもできます。ソーターには、コレクションのサイズなどに基づいたヒューリスティックが含まれている可能性があります。ほとんどの場合、実際には外部から注入されます。これは、パターンが本当に輝いているときです。それは、ユーザーに動作をオーバーライド(または提供)する機能を提供します。

このパターンは、現在遍在している制御の反転のベースです。古典的なパターンが終わったら、次にそれを研究してください。

責任の連鎖とは、通常、より詳細なものからより一般的なものへと変化するオブジェクトの連鎖を持つことです。チェーン内の各部分が答えを提供できますが、詳細レベルは異なります。

人気のあるGOFの例は、コンテキストヘルプシステムです。デスクトップアプリのコンポーネントをクリックすると、表示に役立ちますか?チェーンの最初のアイテムは、クリックしたコンポーネントそのもののヘルプを探すことができます。チェーンの次は、ダイアログを含む全体のヘルプを表示しようとする可能性があります。次に、アプリケーションモジュールについて...など。

まだ読んでいないようですが、GOFの「DesignPatterns」クラシックを読む必要があります。

于 2011-02-18T08:31:44.160 に答える
10

Chain of Responsibilityでは、オブジェクトが処理できない場合、チェーン内の次のオブジェクトに呼び出しを送信するのは各オブジェクトの責任です。

ストラテジーでは、すべてのオブジェクトが同じインターフェイスを持っていますが、使用するオブジェクトを外部の力で供給しなければなりません。

于 2011-02-18T08:32:11.413 に答える
2

ほとんどのパターンはコード (または UML) で非常によく似ていますが、パターンは主にコンテキストに関するものであり、特定のソース コードではなく、解決しようとしている特定の問題に責任を負います。どちらも異なるものを異なる理由で分離します。

チェーン パターンは、リクエストの処理からリクエストを送信する責任を分離します。同じタイプのリクエストを処理できるクラスが多数存在する可能性があります (これらのクラスは通常、同じインターフェースを実装します) が、パターンにより、(チェーン内の) 1 つのクラスから別のクラスにリクエストを渡すことができます。要求を処理するのに最も適したものは、それを取得し、要求を処理する責任があります (または、null ハンドラーがそれを取得してチェーンの終わりを示すまで)。間違ったハンドラーがリクエストを処理することを許可すると、結果は「決して」正しくない可能性があります

戦略とは、処理方法またはアルゴリズムの選択に関するものです。いくつかのサンプルの平均を計算したい場合の例を考えてみましょう。どのアルゴリズムも、特定のコンテキストでは「常に」正しい可能性があります (たとえば、戦略を持つすべてのクラスは同じことを行います: 平均を計算します) が、平均の計算方法または平均を計算するための戦略は、クラスによって異なります。 、および戦略パターンを使用すると、分離された方法で使用する戦略を選択できます。

これをチェーン パターンと比較します。ここでは、平均の計算を担当する 1 つのハンドラーが存在する平均を計算するための要求があり、別のハンドラーが担当する別のハンドラーが存在する標準偏差を計算するための別の要求が存在する可能性があります。標準偏差の計算。したがって、平均を計算する要求は、どのような状況でも、最も適したハンドラー以外のハンドラーによって処理されることはありません。ただし、戦略のどのクラスでも平均を計算できます。一方のクラスで平均を計算する方法が気に入らない場合は、ある戦略を別の戦略と「交換」できます。

これらをソースコードに実装する方法はプログラマーごとに異なる場合がありますが、PTSUT (同じ単体テストに合格する)必要があります。

編集:

一連の責任の特定のメンバーが、戦略パターンを使用して自分の仕事を行う可能性があります。

于 2013-03-03T21:48:15.967 に答える
1

責任の連鎖は、より一般的な戦略パターンの特殊なケースと考えることができます。Konrad が述べたように、パターンベースのソリューションで対処する問題は異なります。

ところで: ほとんどすべての GOF パターンで一種の戦略を見つけることができます。

于 2011-02-18T08:37:12.533 に答える