Observer パターン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/02/26 16:46 UTC 版)
この記事内にあるすべての画像は、ベクターイメージである SVG ファイルとして再作成されるべきです。これにはいくつかの利点があります。詳しくはWikipedia:SVGへの乗り換えを参照してください。この画像の SVG 形式がすでに利用可能である場合は、アップロードしてください。アップロード後、この画像にあるこのテンプレートを{{SVG版利用可能|新しい画像ファイル名.svg}}テンプレートと置き換えてください。 |
通知するオブジェクト側が、通知されるオブジェクト側に観測・観察(英: observe)される形になることから、こう呼ばれる。
出版-購読型モデルとも呼ばれる。暗黙的呼び出しの原則と関係が深い。
分散イベント処理システムの実装にも使われる。言語によっては、このパターンで扱われる問題は言語が持つイベント処理構文で処理される。
クラス図
このパターンの基本は、イベントを通知される側の1つ以上のオブジェクト(オブザーバーまたはリスナーと呼ぶ)を、通知する側のオブジェクト(サブジェクトと呼ぶ)に登録することである。そして通知に使われるメソッドが、抽象メソッドになっていることが重要である。言語によっては、コールバック関数と通知対象コンテキストのペア、あるいはそれらをカプセル化した関数オブジェクト、またはデリゲートが使われる[1]。
以下に、その構造をUMLクラス図で視覚化したものを示す。
各クラスの解説
このパターンに登場する各インタフェースとインタフェースの実装クラスを、以下で解説する。
Subject
イベントを通知するオブジェクト側のインタフェース。1つ以上のObserverすなわちイベントを通知されるオブジェクト側のインタフェースの登録・削除・通知のメソッド書式の体裁を提供する。
以下の抽象メソッドを持つ:
- addObserver() - Subjectが持つ「通知を受け取るObserver群」に、新たなObserverを加える[注釈 1]。
- removeObserver() - addObserver()で追加されたオブジェクトを削除する[注釈 2]。
- notifyObservers() - Subjectが持つ「通知を受け取るObserver群」に、Observer.notify() を呼んでイベントを通知する。
上のUMLクラス図では、Subjectがインタフェースと実装クラスに分かれているが、パターン要件ではない。インタフェースを使わずクラスを直接実装することもある。
ConcreteSubject
Subjectの実装クラス。通知対象であるObserver群を持つ。各Observerが受け取る通知に関する処理を司る。notifyObservers() を呼ぶと、Observer群の1つ以上にイベントを通知する。
Observer
イベントを通知される側のインタフェース。以下の抽象メソッドを持つ:
- notify() - Observerにとっては通知を受け取る処理、このメソッドを呼ぶSubjectにとっては通知を送る処理、と言える。このメソッドの個数や各書式は、通知内容により様々である。
ConcreteObserver
Observerの実装クラス。
典型的用法
- ユーザーが何らかの操作をするなどの外部イベントを待つ。イベント駆動型プログラミングを参照。
- あるオブジェクトの属性値の変化を待つ。なお、複数の属性値の変化でコールバック関数を呼び出すようにしているとイベントの連鎖的発生を引き起こす。
- メーリングリストで、何らかのイベント(新製品情報など)があったとき、購読者リストに登録している人にメッセージを送る。
Observer パターンは Model View Controller (MVC) パラダイムの実装に使われることも多い。MVC では、モデルとビューの連携に Observer パターンが使われる。通常、コントローラーがモデルの変化を検出し、ビュー(オブザーバー)に通知する。
注釈
出典
- 1 Observer パターンとは
- 2 Observer パターンの概要
- 3 コード例
- 4 実装
- 5 関連項目
- Observer パターンのページへのリンク