行为型模式 --- 观察者模式 --- 内容: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新。又称"发布 — 订阅" 模式 角色: 1. 抽象主题 (Subject) 2. 具体主题 (Concrete Subject) —— 发布者 3. 抽象观察者 (Observer) 4. 具体观察者 (Concrete Observer) ——订阅者 适用场景: 1. 当一个抽象模型有两方面,其中一个方面依赖于另一个方面 将这两者封装在独立对象中,使它们可以各自独立地改变和复用 2. 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变 3. 当一个对象必须通知其他对象,而它又不能假定其它对象是谁 换言之,你不希望这些对象时紧密耦合的 优点: 1. 目标和观察者之间的抽象耦合最小 2. 支持广播通信
from abc import ABCMeta, abstractmethod
class Observer(metaclass=ABCMeta):
"""抽象观察者 (Observer)"""
@abstractmethod
def update(self, notice):
# notice 参数是一个 Notice 类的对象
pass
class Notice(object):
"""抽象主题 (Subject)"""
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):
"""具体主题 (Concrete Subject)"""
def __init__(self, company_info=None):
super().__init__()
self.__company_info = company_info
@property
def company_info(self):
return self.__company_info
@company_info.setter
def company_info(self, info):
self.__company_info = info
self.notify() # 推送
class Staff(Observer):
"""具体观察者 (Concrete Observer)"""
def __init__(self):
self.company_info = None
def update(self, notice):
self.company_info = notice.company_info
notice = StaffNotice('初始公司信息')
s1 = Staff()
s2 = Staff()
notice.attach(s1)
notice.attach(s2)
notice.company_info = '公司业绩很好!' # 跳转到 setter,赋值并推送
print(s1.company_info)
print(s2.company_info)
notice.detach(s2)
notice.company_info = '明天放假啦!'
print(s1.company_info)
print(s2.company_info)