1 つのサブジェクトが複数のオブザーバーを持つことができ、サブジェクトが必要に応じて特定のオブザーバーに通知できるように、どの設計パターンを使用するか、またはどのように行うことができるか。古典的なオブザーバーパターンには、1人のオブザーバーまたはオブザーバーのリストを一度に通知するために使用される1つの関数があり、特定のオブザーバーに通知することはできません。
2 に答える
オブザーバー パターンとそのより一般的な変種のパブリッシュ/サブスクライブ イディオムを使用して、オブザーバブルをそのオブザーバーの認識から切り離します。
オブザーバブルが通知が必要な特定のオブジェクトへの参照をすでに知っている場合は、そのオブジェクトを直接呼び出すだけです。
パブリッシュ-サブスクライブ/イベント バスを使用することもできます。特定のオブザーバーごとにトピックを作成し、オブザーバーに特定のトピックをサブスクライブさせ、イベント/パブリッシュをそのトピックに送信します。
@mantrid の発言には同意しますが、フィルタリングをサポートする Observer パターンを使用したり、Pull モデルを使用したりできます。最初のオプションでは、次のようなメソッドを Observer インターフェースに追加しますIsInterested(Object context)
。このメソッドは、すべてのオブザーバーでサブジェクトによって呼び出され、通知を受信する必要があるかどうかを決定します。サブジェクトは、context
パラメーターを介してオブザーバーに情報を提供し、それを支援します。決めます。2 番目のオプションでは、サブジェクトがすべてのオブザーバーに何らかの状態変化を通知するプル モデルを使用します。これらのオブザーバーは、サブジェクトから新しい状態情報をさらに要求するか要求しない (必要な情報をプルする) かを選択できます。