首页 > 其他分享 >设计模式-行为型模式之观察者

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

时间:2022-10-11 22:56:02浏览次数:65  
标签:info 订阅 self 观察者 模式 __ 设计模式 company def

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

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

 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:

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

 

标签:info,订阅,self,观察者,模式,__,设计模式,company,def
From: https://www.cnblogs.com/shixiaogu/p/16782939.html

相关文章

  • 18.设计模式-模板方法
    //1.定义模板抽象父类,将特有的业务定义为抽象方法,定义钩子函数//2.子类继承抽象父类,实现抽象方法//3.测试publicabstractclassCake{//定义成final,禁止子类重写......
  • 【JS设计模式笔记】神奇的魔术师-简单工厂模式(创建型)
    简单工厂模式(SimpleFactory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。第一次需求开发一个登录模块的需求,用户名输入框......
  • 相比于其他的会议模式华为云WeLink会议空间有什么新突破
    在企业工作中,线上+线下结合的方式使“线上会议”更加日常化,现在市面上也已经有许多线上会议的软件,但为什么华为云还要推出华为云WeLink会议空间呢?难道不担心市场饱和连一杯......
  • 逆向工程第001篇:解锁FIFA07传奇模式
        FIFA07传奇难度的解锁,可以说是所有FIFA07玩家的终极目标。但是如果想以正常方式对其进行解锁,绝对是一件耗时耗力的工作。所以在这里我打算通过分析游戏存档文件......
  • KMP模式匹配 学习笔记
    功能能在线性时间内判断字符串\(A[1~N]\)是否为字符串\(B[1~M]\)的子串,并求出字符串\(A\)在字符串\(B\)中各次出现的位置。实现1.对字符串\(A\)进行自我“匹配”,求出一......
  • 单例模式
    单例模式单例模式是指使用的时候只new一次,即使多次使用这个类,我们只需要new一次就可以,这样就达到了节省空间的效果,单例模式分为饿汉式和懒汉式这两个模式单例模式的无......
  • 4. 设计模式--原型模式
    原型模式在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式。原型......
  • Java设计模式之 装饰模式实验报告书
    Java设计模式之装饰模式实验报告书姓名:班级:学号:实验三:装饰模式的应用一、实验目的熟练使用JAVA实现装饰模式,理解设计模式的模式动机,掌握模式结构,学习如何使用代码实现......
  • 42. JS严格模式(use strict)详解
    1.前言由于JavaScript语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用var关键字来提前声明(例如:url='http://c.biancheng.net/';),此时JavaScript解释......
  • 设计模式二(建造者模式)
    建造者模式   设计模式的关键步骤是    importjava.util.ArrayList;importjava.util.List;publicclassMeal{privateList<Item>items=......