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

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

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

复制代码
 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:

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

 

posted on   默玖  阅读(59)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示