Observerパターン - TypeScriptでのイベント駆動プログラミング

イベント駆動システム構築のためのObserverパターンを学びましょう。Publish-Subscribe、React状態管理、リアルタイム通知のTypeScript実装例。

Behavioral

詳細な説明

Observerパターン

Observerパターンは、オブジェクト間の1対多の依存関係を定義し、1つのオブジェクト(サブジェクト)の状態が変化すると、そのすべての依存オブジェクト(オブザーバー)に自動的に通知されて更新されるようにします。イベント駆動プログラミングの基盤です。

コアメカニズム

type Listener<T> = (data: T) => void;

class EventEmitter<T> {
  private listeners: Listener<T>[] = [];

  subscribe(listener: Listener<T>) {
    this.listeners.push(listener);
    return () => {
      this.listeners = this.listeners.filter(l => l !== listener);
    };
  }

  emit(data: T) {
    this.listeners.forEach(l => l(data));
  }
}

プッシュ vs プル

プッシュモデルでは、サブジェクトが通知と共にデータを送信します。プルモデルでは、サブジェクトは変更が発生したことのみを通知し、オブザーバーがサブジェクトに新しい状態を問い合わせます。プッシュはシンプルで、プルはオブザーバーに読み取るデータの制御を与えます。

メモリリーク防止

重要な関心事は購読解除です。オブザーバーが購読解除を忘れると、リスナー配列に無期限に残り、メモリリークを引き起こします。現代の実装では、購読解除関数を返すか、WeakRefを使用して参照を自動的にクリーンアップします。

現代での実装

Observerパターンは現代の開発のあらゆる場所に現れます:

  • DOMイベント: addEventListener / removeEventListener
  • React: useStateuseEffectフックはObserverセマンティクスに従います
  • RxJS: Observableは変換、フィルタリング、合成のためのオペレーターでパターンを拡張します
  • Node.js EventEmitter: サーバーサイドイベント用の組み込みpublish-subscribe

Mediatorとの比較

Observerは任意のオブジェクトがイベントに購読できますが、Mediatorはコミュニケーションロジックを集中化します。シンプルな通知チェーンにはObserverを、コンポーネント間のインタラクションルールが複雑な場合はMediatorを使用しましょう。

ユースケース

Observerは、リアルタイム通知システム、UI状態管理(React、Vue、Angular)、メッセージキューとイベントバス、データ変更時に更新されるライブダッシュボード、密結合なしに複数のコンポーネントが状態変化に反応する必要があるシステムに不可欠です。

試してみる — Design Pattern Reference

フルツールを開く