1

チェーンに渡されるオブジェクトとしてHashMapを使用し、ハンドラーによって新しいコンテンツが追加される可能性があるCoRパターンの実装例を見てきました。以下のコードの概要:

class HandlerImpl implements Handler {

     Handler next;

     void handle(HashMap context) {
         // do handler logic, perhaps adding new stuff to "context"
         if (next != null)
             next.handle();
     }
 }

contextハンドラーは、コードを繰り返さずにハンドラーをフォローすることで使用できる新しい情報でを拡張できるため、使いたくなります。一方、ハンドラーは相互に依存するようになります。ハンドラーはまだ緩く結合されていますが、それでも、ハンドラーの順序はますます重要になります。

このコードは臭いですか?コンテキストオブジェクトに新しい情報を追加せずにCoRパターンを使用できないことがわかった場合、そのような場合に使用する適切なパターンは何ですか?

4

2 に答える 2

2

それはあなたの「ハンドラー」が何をしているのかによります。1つの代替方法は、必要な入力とその出力を宣言する「パイプライン」に変更することです。出力は同じタイプである可能性があります(おそらく入力オブジェクトが変更されている可能性があります)。または、何らかの変換である可能性があります。その変換は、情報を追加するだけの場合もあれば、まったく異なることを行う場合もあります。情報を追加するだけでよい場合は、コンポジションを使用してかなり簡単に追加できます。

このように、各ハンドラーは、必要なデータ/生成するデータに関して緊密に結合(および明示的)されますが、そのデータを生成および消費するデータに関しては緩く結合されます。

基本的に、「最善のアプローチ」は以下に依存します。

  • あなたがやろうとしていること
  • 使用している言語/プラットフォーム(不変の推力がありますか?静的型付けとジェネリックがありますか?)
于 2011-11-05T09:09:08.360 に答える
1

コンテキストをチェーンに渡すことはパターンの違反ではないと思います。

サーブレットフィルターは通常、CoRパターンの例として使用され、フィルターは、共有リクエストオブジェクトの属性を自由に追加/削除したり、後続のフィルターまたはサーブレットによって実行される操作をインターセプトするためにリクエストを新しいオブジェクトでラップしたりすることもできます。 。

于 2011-11-05T09:13:15.017 に答える