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
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))
利点
- ターゲットとオブザーバーの間の抽象的な結合の程度は最小限です
- ブロードキャスト通信をサポートする