0

オブザーバー パターン
- 仮定:

  • 10 個のアイテムのうち、オブザーバーがサブスクライブしたいのは 3 つだけです。
  • サブジェクトはオブザーバーの関数を呼び出して、いくつかの更新があることを彼に知らせます。

さて、オブザーバーに 3 つの項目だけに関する更新を送信するのはサブジェクトの責任ですか?
または
、サブジェクトは単に更新があることをオブザーバーに伝えることができます。

正しい抜け道は?それは問題ですか?

4

3 に答える 3

1

このサブジェクトに関心のあるオブザーバーのリストを保持し、更新メソッドを呼び出してこれらのオブザーバーに通知するのはサブジェクトです。オブザーバーは、関心のあるサブジェクトのリストを保持しません。

これに基づいて、サブジェクトが更新されると、サブジェクトは update(..) メソッドまたはそのリスト内のオブザーバーに類似したものを呼び出します。サブジェクトは、メソッドのパラメーターとしてオブジェクトの変更をカプセル化する、このサブジェクトの this オブジェクトを渡すことができます (オブザーバーは、サブジェクトのメソッド自体を呼び出して、関心のあるデータを取得します)

于 2012-05-03T04:58:18.457 に答える
0

さて、3つのアイテムだけに関する更新をオブザーバーに送信するのはサブジェクトの責任ですか?

また

サブジェクトは、更新があることをオブザーバーに簡単に伝えることができます-10から必要なものをフェッチしますか?

正しい方法はどれですか?それは重要ですか?

ここに絶対的な正しい答えはありません。

これらは実装の選択であり、実際、デザインパターンのオブザーバーの実装セクションで言及されています。

_6。オブザーバー固有の更新プロトコルの回避:プッシュモデルとプルモデル。オブザーバーパターンの実装では、多くの場合、サブジェクトが変更に関する追加情報をブロードキャストします。サブジェクトは、この情報を引数としてUpdateに渡します。情報量は大きく異なる場合があります。

プッシュモデルと呼ばれる極端な例では、サブジェクトは、変更が必要かどうかに関係なく、変更に関する詳細情報をオブザーバーに送信します。もう一方の極端な例はプルモデルです。サブジェクトは最小限の通知しか送信せず、オブザーバーはその後明示的に詳細を要求します。

プルモデルは、被験者が観察者を知らないことを強調しますが、プッシュモデルは、被験者が観察者のニーズについて何かを知っていることを前提としています。サブジェクトクラスはオブザーバークラスについて常に正しいとは限らないという仮定を行うため、プッシュモデルはオブザーバーの再利用性を低下させる可能性があります。一方、オブザーバークラスはサブジェクトの助けなしに何が変更されたかを確認する必要があるため、プルモデルは非効率的である可能性があります。

_7。対象の変更を明示的に指定する。サブジェクトの登録インターフェースを拡張して、関心のある特定のイベントに対してのみオブザーバーを登録できるようにすることで、更新の効率を向上させることができます。そのようなイベントが発生すると、サブジェクトはそのイベントに関心を登録したオブザーバーのみに通知します。これをサポートする1​​つの方法は、Subjectオブジェクトのアスペクトの概念を使用します。特定のイベントへの関心を登録するために、オブザーバーは

void Subject :: Attach(Observer *、Aspect&interest);

ここで、interestは対象のイベントを指定します。通知時に、サブジェクトは変更されたアスペクトを更新操作のパラメーターとしてオブザーバーに提供します。例えば:

void Observer :: Update(Subject *、Aspect&interest);

プッシュモデルを使用する方が理にかなっている場合は、被験者がオブザーバーのニーズについてもう少し知識を持ち、アスペクトモデルを使用して、オブザーバーが被験者のデータの特定の部分への関心を登録できるようにします。それのための!

私は通常、プルモデルを使用することを好み、オブザーバーが主題について少し詳細な知識を持っていることを受け入れます(実装は簡単です)が、あなたが提案していることはおそらくあなたの状況では問題ありません。

于 2012-05-02T22:11:53.870 に答える
0

さまざまなイベントに関する特定の通知を使用したいと思います。通常はプッシュモデルを使用します。のようにHey, I just earned some money. Here is actual amount I have earned。の代わりにHey, something happened to me.。後者は、すべてのロジックをクライアント(オブザーバー)に移動します。クライアントは何が変更されたかを検証する必要があります。複数のクライアントがある場合、この検証ロジックは複製されます。実際、他のオブザーバーがいない場合は、このパターンは必要ありません:)

また、特定の通知では、クライアントが関心を持っているイベントのみをサブスクライブできます。したがって、他のことが起こったとき(つまり、対象が映画を見たとき)にオブザーバーが気になることはありません。

于 2012-05-02T12:40:29.797 に答える