责任链模式
概述
- 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象都得到通知并自动更新。又称发布订阅模式
对象
- 抽象主题(Subject)
- 具体主题(ConcreteSubject)——发布者
- 抽象观察者(Observer)
- 具体观察者(ConcreteObserver)——订阅者
适用场景
- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在两个独立对象中以使他们可以独立的改变和复用
- 当对一个对象的改变需要同时改变其他对象时,而不知道具体有多少对象需要改变
- 当一个对象必须通知其他对象,而他又不能假定其他对象是谁,换言之,你不希望这些对象是紧耦合的
例子
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))
优点