🐅

Observer

2023/09/10に公開

Observer パターンは、オブジェクトの状態の変更が他のオブジェクトに影響を及ぼす場合に、これらのオブジェクト間の依存関係を定義するデザインパターンです。状態が変更されたときに自動的に通知されるオブジェクトを登録します。

主要な構成要素:

  1. Subject (被験者): Observerを追加、削除、通知するメソッドを持つオブジェクト。
  2. Observer (観察者): Subjectからの更新を受け取るオブジェクトのインターフェース。
  3. ConcreteObserver (具体的な観察者): Observerインターフェースを実装するオブジェクトで、Subjectからの更新を受け取ると何らかのアクションを行います。

例:

ニュースサービスのサブスクリプションを考えてみましょう。

  1. Subject:

    class NewsService:
        def __init__(self):
            self._observers = []
            self._news = None
    
        def add_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._news)
    
        def add_news(self, news):
            self._news = news
            self.notify_observers()
    
    
  2. Observer:

    from abc import ABC, abstractmethod
    
    class Subscriber(ABC):
        @abstractmethod
        def update(self, news):
            pass
    
    
  3. ConcreteObserver:

    class EmailSubscriber(Subscriber):
        def update(self, news):
            print(f"Email: New news published - {news}")
    
    class SmsSubscriber(Subscriber):
        def update(self, news):
            print(f"SMS: New news published - {news}")
    
    

使用方法:

    news_service = NewsService()

    email_subscriber = EmailSubscriber()
    sms_subscriber = SmsSubscriber()

    news_service.add_observer(email_subscriber)
    news_service.add_observer(sms_subscriber)

    news_service.add_news("Observer Pattern in Python!")

出力:

Email: New news published - Observer Pattern in Python!
SMS: New news published - Observer Pattern in Python!

利点:

  1. 疎結合: Observer パターンは、SubjectとObserverを疎結合にします。SubjectはObserverの具体的なクラスを知らず、Observerはいつ自分が更新を受け取るか知りません。
  2. 拡張性: 新しいObserverを追加するのは簡単で、Subjectのコードを変更することなく実装できます。

Observer パターンは、状態の変更が他の多くのオブジェクトに影響を及ぼす可能性がある場合、またはシステム内のオブジェクト間の相互作用が変わる可能性がある場合に特に有用です。

Discussion