概要
Observer(オブザーバ)パターンは、
あるオブジェクト(Subject)の状態が変化した際に、それに依存する複数のオブジェクト(Observers)へ通知を一斉に行う仕組みを提供する構造的パターンである。
この設計により、疎結合で反応的なシステム構築が可能となり、
イベント駆動設計・データ同期・非同期通知など多くの場面で活用される。
1. なぜObserverが必要か?
❌ 通知先がハードコードされた密結合
def update_dashboard():
...
def update_log():
...
def on_change():
update_dashboard()
update_log()
→ 通知対象が増えると変更箇所も増え、拡張に弱い設計
✅ 観測者(Observer)を登録制にする
subject.register(update_dashboard)
subject.register(update_log)
subject.notify()
→ 通知対象の追加・削除が柔軟に
2. 基本構造
✅ Observerインタフェース
class Observer:
def update(self, data):
raise NotImplementedError
✅ Subject(通知元)
class Subject:
def __init__(self):
self._observers = []
def register(self, observer: Observer):
self._observers.append(observer)
def unregister(self, observer: Observer):
self._observers.remove(observer)
def notify(self, data):
for observer in self._observers:
observer.update(data)
✅ Observer実装クラス
class Logger(Observer):
def update(self, data):
print(f"[LOG] {data}")
class Dashboard(Observer):
def update(self, data):
print(f"[UI] Refreshing dashboard with: {data}")
✅ 使用例
subject = Subject()
subject.register(Logger())
subject.register(Dashboard())
subject.notify("New data received")
[LOG] New data received
[UI] Refreshing dashboard with: New data received
3. Python的応用:関数やラムダによる購読
class FunctionObserver:
def __init__(self, func):
self._func = func
def update(self, data):
self._func(data)
subject.register(FunctionObserver(lambda d: print(f"Lambda -> {d}")))
→ オブジェクトだけでなく関数も購読可能にすることで、より柔軟な通知先設計
4. 実務ユースケース
✅ イベント駆動設計の基礎として
- UIイベント、ボタン操作、外部APIからのリアクティブ処理
✅ データ同期処理(状態の一貫性)
- モデルの変更 → UIコンポーネントやDBへ通知
✅ 非同期通知・リアルタイムログ
- プロセス監視やシステムログを複数サブスクライバに中継
✅ 自作Pub/Sub機構やイベントバスの基盤
- 高度なアーキテクチャではイベント名とルーティングによる複数購読の構築も可能
5. よくある誤用と対策
❌ ObserverがSubjectに強く依存
→ ✅ 双方向依存を避け、Subject → Observer の一方向に設計する
❌ 通知のたびに全てのObserverが呼ばれる
→ ✅ フィルタ条件やイベント種類別購読を設け、不要な更新を防止
❌ 例外発生で通知が中断される
→ ✅ notify()
内で try...except
を適用し、堅牢な通知フローを保証
結語
Observerパターンとは、“変化をリアルタイムで伝播させる仕組みを構造的に実現する”技法である。
- 変更の検知と通知を、明示的な関係として表現し、再利用可能な構造に
- サブスクライバを疎結合に保ちつつ、拡張性と反応性を両立
- Pythonの動的性により、関数・クラス・匿名関数まで広範なObserver構成が可能
Pythonicとは、“変化に自然に追従できる構造を設計する”ことであり、
Observerパターンはその柔軟性と即応性を、システム設計に注入するための技法である。