<一覧に戻る

オブザーバーパターン

オブザーバーパターンは、オブジェクト間の一対多の依存関係を定義するためのデザインパターンです。このパターンを使用すると、あるオブジェクト(被観察者)が状態を変更したときに、その状態に依存している他のオブジェクト(観察者)に自動的に通知されることができます。これにより、オブジェクトの結合度を減らし、柔軟性を向上させることができます。

オブザーバーパターンの基本構造

オブザーバーパターンは、以下の3つの主要なコンポーネントから構成されます。

  1. 被観察者(Subject): 観察者に通知を送信するオブジェクトです。
  2. 観察者(Observer): 被観察者の状態に興味を持ち、通知を受け取るオブジェクトです。
  3. 通知(Notification): 被観察者が観察者に送信する情報です。

サンプルコード

それでは、オブザーバーパターンを使用した簡単なPythonのサンプルコードを見てみましょう。この例では、WeatherStation(気象台)を被観察者として、Display(表示装置)を観察者として実装します。

ステップ1: 被観察者の実装

まず、WeatherStationクラスを定義します。このクラスは、温度の状態を保持し、観察者を登録・解除するメソッドを持ちます。また、温度が変更されたときに観察者に通知を送信します。

class WeatherStation:
    def __init__(self):
        self._observers = []
        self._temperature = None

    def register_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        self._observers.remove(observer)

    def notify_observers(self):
        for observer in self._observers:
            observer.update(self._temperature)

    def set_temperature(self, temperature):
        self._temperature = temperature
        self.notify_observers()

ステップ2: 観察者のインターフェース

次に、観察者のインターフェースを定義します。このインターフェースには、被観察者からの通知を受け取るためのupdateメソッドを含めます。

class Observer:
    def update(self, temperature):
        raise NotImplementedError("Subclasses must implement this method.")

ステップ3: 観察者の実装

Displayクラスを実装し、Observerインターフェースを継承します。このクラスは、温度の変更を受け取って表示する役割を担います。

class Display(Observer):
    def update(self, temperature):
        print(f"Current temperature: {temperature}°C")

ステップ4: 実行例

最後に、これらのクラスを使って実際にオブザーバーパターンを実行してみましょう。

if __name__ == "__main__":
    weather_station = WeatherStation()
    display = Display()

    weather_station.register_observer(display)

    weather_station.set_temperature(25)
    weather_station.set_temperature(30)

コードの解説

WeatherStationクラス:

  • __init__: 初期化メソッドで、観察者のリストと温度を保持します。
  • register_observer: 観察者を登録します。
  • remove_observer: 観察者を解除します。
  • notify_observers: 登録された全ての観察者に通知を送信します。
  • set_temperature: 温度を設定し、観察者に通知を送信します。

Observerクラス:

  • update: 観察者が通知を受け取るためのメソッドです。サブクラスで実装する必要があります。

Displayクラス:

  • update: 温度が変更されたときに呼び出され、現在の温度を表示します。

実行例:

  • WeatherStationをインスタンス化し、Displayを登録します。その後、温度を変更すると、Displayが自動的に通知を受け取ります。

このようにして、オブザーバーパターンを利用することで、オブジェクトの状態変更を他のオブジェクトに効率的に伝えることができます。オブザーバーパターンは、ユーザーインターフェースやメッセージングシステムなど、さまざまな場面で非常に役立つパターンです。

出力結果: