2011-02-10 14 views
15

私が理解しているように、オブザーバーパターンは、複数のオブザーバーが単一のサブジェクトをモニターすることを可能にします。反対のシナリオのパターンはありますか?いくつかのサブジェクトを監視し、いずれかがNotifyイベントを起こしたときに応答する単一のオブザーバのパターンがありますか?オブザーバーパターンの反対は何ですか?

+0

これは、Observableが複数あるObserverのようなものです。したがって、Observableはすべて、その状態が変化したときに単一のObserverを更新し、その更新(Observable o、Object arg)が呼び出されたときにObservableが異なるObservableを区別することができます。 –

+0

実行時にObservableを新しいObservableに動的に登録する必要があるということは、ここで唯一の変更だと感じています。新しい観察可能性が生まれたときの意味。これを登録するにはObserverに通知する必要があります。もう一つの方法は、新しいオブザーバーが起きたときです。このObserverオブジェクトは常にそのコンストラクタにObservableで構築されます。したがってObservableコンストラクタのようなものは、それが起動されたときに単一のObserverを受け入れるべきです。 –

答えて

13

Observerパターンを使用することもできます。多くの監視オブジェクトに対してオブザーバと同じオブジェクトレジスタを使用するだけです。オブザーバオブジェクトがイベントを報告するオブジェクトに適切なアクションを選択できるように、ある種の観測オブジェクト識別子( "this"ポインタ、一意のID番号など)を受け取るように "Notify"イベントを設定することをお勧めします。

+2

私の考えはまさに。これは私にとってオブザーバーパターンのように聞こえる。 –

+0

イベントハンドラが1回だけ実行されることを望んでいない限り、パブリッシャがイベントを発生させる回数は関係ありません。 –

+1

これに追加するにはhttp://sourcemaking.com/design_patterns/observer(単一のオブザーバを使用することは「デザイナーの裁量に委ねられます」)、およびhttp://www.eecho.info/Echo/design-pattern/observer-java-pattern /(バリアントは「シングルオブザーバーと複数のオブザーバー」です) – anon

3

はい。これはオブザーバパターンのもう一つの応用です。

オブザーバーは、多くの科目に自分自身を追加します。 あなたが観測している対象に関係なく同じアクションを実行したい場合は、使用しているオブザーバパターンとまったく同じです。

イベントをトリガーしたサブジェクトに応じて別のアクションを実行する場合は、ObserverのActionPerformedメソッドに渡されるActionパラメータを使用して、どのサブジェクトがイベントをトリガしたかを判断できます。 (これらの名前は、使用する言語または選択したライブラリによって異なる場合があります)

+0

ありがとう、呉、私の質問に答える時間を取ってくれた。 – blueshift

0

イベントを発生させる監視オブジェクトの数に関係なく、オブザーバを一度だけ反応させたい場合は、イベントハンドラの一部を "最初のソースがイベントを発生させたときにオブザーバーを他のすべてのソースから登録解除するか、別の(または同じソースが一定の間隔をおいて再度)イベントをいつ決定するかを決定する必要があります。オブザーバーに再び反応させてください...

+0

Notifyイベントを発生させた後でサブジェクトを無効にしたいので、ここであなたのアドバイスを使いたいかもしれません。 – blueshift

1

オブザーバーのモニターが似ている場合は、オブザーバーにそれらをすべて監視させることができます。そうでない場合は、モンテルを分離してください。単一責任規則。

1

関連するメディエーターパターンも考慮してください。ここ

Mediatorパターンは、オブジェクトのセットは、(Wikipedia)をどのように相互作用するかをカプセル化するオブジェクトを定義し

さらに詳しい情報:http://sourcemaking.com/design_patterns/mediator

私も非常にMediator Vs Observer Object-Oriented Design PatternsにCDCの答え@のように:

オブザーバーパターン:1対多のdepを定義します。 1つのオブジェクトが状態を変更したときに、そのすべての従属物が自動的に通知され、更新されるように、オブジェクト間の終了性。

メディエーターパターン:オブジェクトセットの相互作用をカプセル化するオブジェクトを定義します。メディエータは、オブジェクトが明示的に相互参照するのを防ぐことで、疎結合を促進し、相互作用を個別に変更することができます。

関連する問題