Observer は、 振る舞いに関するデザインパターンの一つで、 オブジェクトが別のオブジェクトに状態の変化を通知できるようにします。
Observer パターンは、 サブスクライバー・インターフェースを実装するいかなるオブジェクトのイベント通知の申し込みと停止をする方法を提供します。
複雑度:
人気度:
使用例: Observer パターンは、 Java コードではよく見かけます (特に、 GUI コンポーネントで)。 他のオブジェクトで起きるイベントに反応することを、 そのクラスに結合せずに可能とします。
Java のコア・ライブラリーでのこのパターンの使用例です:
見つけ方: このパターンは、 オブジェクトをリストに保存するサブスクリプション・メソッドと、 そのリスト中のオブジェクトの更新メソッドの呼び出しにより、 識別できます。
イベント・サブスクリプション
この例では、 Observer パターンを使い、 あるテキスト・エディターのオブジェクト間の間接的共同作業を確立します。 Editor
オブジェクトに変化があるたびに、 変化をサブスクライバーに通知します。 EmailNotificationListener
と LogOpenListener
は、 その主たる振る舞いを実行して、 通知に反応します。
サブスクライバー・クラスはエディターのクラスとは結合されておらず、 必要なら他のアプリでも使えます。 Editor
クラスは、 抽象サブスクライバー・インターフェースにのみ依存しています。 このため、 エディターのコードを変更することなく、 新しいサブスクライバーを追加できます。
publisher
publisher/EventManager.java: 基本的なパブリッシャー
editor
editor/Editor.java: 他のオブジェクトから追跡される具象パブリッシャー
listeners
listeners/EventListener.java: 共通のオブザーバー・インターフェース
listeners/EmailNotificationListener.java: 通知受け付け後、 メールを送信
listeners/LogOpenListener.java: 通知受け付け後、 ログにメッセージを書き込む
Demo.java: 初期化コード
OutputDemo.txt: 実行結果