设计模式-行为型模式之观察者
观察者模式也可以理解为:发布订阅模式
发布者状态更新,通过管道接口实现订阅者动态更新
1 class Middleware: 2 """ 3 发布者和订阅者交互类 4 0、订阅者容器列表 5 1、包括订阅者的增加、删除 6 2、通过管道通知订阅者 7 """ 8 9 def __init__(self): 10 self.subscribes = list() 11 12 def attach(self, obs): 13 self.subscribes.extend(obs) 14 15 def detach(self, obs): 16 self.subscribes.remove(obs) 17 18 def notify(self): 19 """遍历订阅者,调用订阅者的update方法(订阅者继承抽象基类),实现实时更新""" 20 for obs in self.subscribes: 21 obs.update(self) 22 23 24 class Publisher(Middleware): 25 """ 26 发布者角色 27 """ 28 29 def __init__(self, company_info): 30 super().__init__() 31 self.__company_info = company_info 32 33 @property 34 def company_info(self): 35 return self.__company_info 36 37 @company_info.setter 38 def company_info(self, info): 39 self.__company_info = info 40 # 通知订阅者进行消息更新 41 self.notify() 42 43 44 """=================================================以上为发布者====================================================""" 45 """=================================================以下为订阅者====================================================""" 46 47 from abc import ABCMeta, abstractmethod 48 49 50 class Observer(metaclass=ABCMeta): 51 @abstractmethod 52 def update(self, notice): 53 ... 54 55 56 class Subscribe(Observer): 57 """ 58 订阅者角色 59 """ 60 61 def __init__(self): 62 self.company_info = None 63 64 def update(self, notice): 65 # 将发布者最新消息赋给订阅者 66 self.company_info = notice.company_info 67 68 69 if __name__ == '__main__': 70 # 实例化发布者 71 pub = Publisher("蓝天计划") 72 # 实例化订阅者 73 s1 = Subscribe() 74 s2 = Subscribe() 75 # 添加订阅者 76 pub.attach([s1, s2]) 77 # 发布者发布消息 78 pub.company_info = "准备下个月,给开发集体调薪" 79 # 输出订阅者消息,校验有无更新 80 print(s1.company_info) 81 print(s2.company_info) 82 # # 移除订阅者s1 83 # pub.detach(s1) 84 # 再次发布消息 85 pub.company_info = "画饼?" 86 # 再次输出订阅者消息 87 print(s1.company_info) 88 print(s2.company_info)
output:
准备下个月,给开发集体调薪
准备下个月,给开发集体调薪
画饼?
画饼?