深圳幻海软件技术有限公司 欢迎您!

设计模式-行为型模式之观察者

2023-03-13

观察者模式也可以理解为:发布订阅模式发布者状态更新,通过管道接口实现订阅者动态更新1classMiddleware:2"""3发布者和订阅者交互类40、订阅者容器列表51、包括订阅者的增加、删除62、通过管道通知订阅者7"""89def__init__(self):10self.subscribes

观察者模式也可以理解为:发布订阅模式

  发布者状态更新,通过管道接口实现订阅者动态更新

 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:

  准备下个月,给开发集体调薪
  准备下个月,给开发集体调薪
  画饼?
  画饼?