デザインパターン-動作-オブザーバーパターン(パブリッシュおよびサブスクライブパターン)

Chain ofResponsibilityモデル

概要概要

  • オブジェクト間の1対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトに通知され、自動的に更新されます。パブリッシュ/サブスクライブモデル

オブジェクト

  • 抽象主題(主題)
  • 具体的な主題(ConcreteSubject)-出版社
  • 抽象オブザーバー(オブザーバー)
  • コンクリートオブザーバー(ConcreteObserver)-サブスクライバー

該当シーン

  • 抽象モデルに2つの側面がある場合、一方の側面はもう一方の側面に依存します。2つを2つの独立したオブジェクトにカプセル化して、それらを個別に変更および再利用できるようにします。
  • オブジェクトへの変更が同時に他のオブジェクトを変更する必要がある場合、変更する必要のあるオブジェクトの数は不明です。
  • オブジェクトが他のオブジェクトに通知する必要があり、他のオブジェクトが誰であるかを推測できない場合、つまり、これらのオブジェクトを緊密に結合したくない場合

from abc import ABCMeta, abstractmethod

# 抽象订阅者
class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(self, notice):
        pass

# 抽象发布者
class Notice:
    def __init__(self):
        self.observers = []
    
    def attach(self, obs):
        self.observers.append(obs)
    
    def detach(self, obs):
        self.observers.remove(obs)
    
    def notify(self):
        for obs in self.observers:
            obs.update(self)
    

# 发布者
class StaffNotice(Notice):
    def __init__(self, info):
        super().__init__()
        self.__info = info 
    
    @property
    def info(self):
        return self.__info
    
    @info.setter
    def info(self, info):
        self.__info = info
        self.notify()

#订阅者
class Staff(Observer):
    def __init__(self):
        self.info = None
        self.notice = None

    def subscribe(self, notice):
        self.notice = notice
        notice.attach(self)
    
    def unsubscribe(self):
        if not self.notice:
            return
        self.notice.detach(self)
        self.notice = None

    def update(self, notice):
        self.info = notice.info
    
    def __str__(self):
        return self.info

# client
staff_notice = StaffNotice("初始化信息")
staff1 = Staff()
staff2 = Staff()
staff1.subscribe(staff_notice)
staff2.subscribe(staff_notice)
staff_notice.info = "更新消息: 公司放假了!!!!"

print(str(staff1))
print(str(staff2))

staff1.unsubscribe()
staff_notice.info = "更新消息: 公司又不放假了!!!!"
print(str(staff1))
print(str(staff2))

利点

  • ターゲットとオブザーバーの間の抽象的な結合の程度は最小限です
  • ブロードキャスト通信をサポートする

おすすめ

転載: blog.csdn.net/DALAOS/article/details/114127854
おすすめ