オブザーバーパターンは、オブジェクト間の一対多の依存関係を定義するためのデザインパターンです。このパターンを使用すると、あるオブジェクト(被観察者)が状態を変更したときに、その状態に依存している他のオブジェクト(観察者)に自動的に通知されることができます。これにより、オブジェクトの結合度を減らし、柔軟性を向上させることができます。
オブザーバーパターンは、以下の3つの主要なコンポーネントから構成されます。
それでは、オブザーバーパターンを使用した簡単なPythonのサンプルコードを見てみましょう。この例では、WeatherStation
(気象台)を被観察者として、Display
(表示装置)を観察者として実装します。
まず、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()
次に、観察者のインターフェースを定義します。このインターフェースには、被観察者からの通知を受け取るためのupdate
メソッドを含めます。
class Observer:
def update(self, temperature):
raise NotImplementedError("Subclasses must implement this method.")
Display
クラスを実装し、Observer
インターフェースを継承します。このクラスは、温度の変更を受け取って表示する役割を担います。
class Display(Observer):
def update(self, temperature):
print(f"Current temperature: {temperature}°C")
最後に、これらのクラスを使って実際にオブザーバーパターンを実行してみましょう。
if __name__ == "__main__":
weather_station = WeatherStation()
display = Display()
weather_station.register_observer(display)
weather_station.set_temperature(25)
weather_station.set_temperature(30)
__init__
: 初期化メソッドで、観察者のリストと温度を保持します。register_observer
: 観察者を登録します。remove_observer
: 観察者を解除します。notify_observers
: 登録された全ての観察者に通知を送信します。set_temperature
: 温度を設定し、観察者に通知を送信します。update
: 観察者が通知を受け取るためのメソッドです。サブクラスで実装する必要があります。update
: 温度が変更されたときに呼び出され、現在の温度を表示します。WeatherStation
をインスタンス化し、Display
を登録します。その後、温度を変更すると、Display
が自動的に通知を受け取ります。このようにして、オブザーバーパターンを利用することで、オブジェクトの状態変更を他のオブジェクトに効率的に伝えることができます。オブザーバーパターンは、ユーザーインターフェースやメッセージングシステムなど、さまざまな場面で非常に役立つパターンです。