読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

17.Observer 状態の変化を通知する

Observerは観察者。観察対象が変化すると観察者に対して通知。

f:id:p-monster:20121218195800p:plain

Subject・・・観察される側。Observerを登録・削除するメソッドと、登録されているObserverへ通知するメソッドを持つ。また、Subjectの状態を取得するAPIの宣言をする
ConcreteSubject・・・具体的なSubject。状態が変化したら通知メソッドを呼び出す
Observer・・・状態変化の通知を受け取るAPI
ConcreteObserver・・・Observerの実装

SubjectとObserverはお互いに具体的なクラス名を知らなくても通知できる。

  • 抽象クラスやインターフェースを使って、具象クラスから抽象メソッドを引き剥がす
  • 引数でインスタンスを渡すときや、フィールドでインスタンスを保持するときには、具象クラスの型にしないで、抽象クラスやインターフェースの型にしておく

通知がループしそうな場合には呼び出しフラグの管理を行う。

関連しているパターン

Mediatorパターン・・・MeiatorパターンではMediatorとColleagueの通知にObserverパターンを使う場合がある。MediatorパターンとObserverパターンは状態変化を通知するという点は似ているが、MediatorパターンはMediatorがColleagueの状態を知りロジックを制御するために通知を受ける。一方ObserverパターンではSubjectの状態変化をObserverに通知すること、通知して同期することに主眼がある。

参考:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門