Python笔记之观察者模式

作者:谷雨yun 时间:2023-04-05 18:37:20 

观察者模式中的主题对象一般存在着一个其他服务依赖的核心服务,并且维护着其他依赖此核心服务的对象列表(即观察者或监视者列表),当主题对象发生变化时,观察者应该改变自己的状态或者进行某些操作

观察者模式中的三个角色:

  • 主题:即观察者观察的对象,一般是需要有注册和注销方法,用来添加观察者和删除观察者。

  • 观察者基类:这个类主要是需要定义一个接口,以便主题发生变化时可以得到对应的通知信息。

  • 观察者:这个类需要具体实现基类中的“通知”接口,以便和主题的变化保持同步。

主题的两种通知方式:

  • 拉模型:这个方式重心在观察者上,当主题发生变化时,会广播所有的观察者,然后由观察者来获取相应的数据。

  • 推模型:这个方式重心在主题上,当主题发生变化时,主题将根据观察者的需要将自身的变化推送给需要的观察者。

观察者模式的优点:

  • 观察者模式中彼此交互的对象都是保持松耦合的。主题对观察者唯一的了解就是观察者实现的“通知”接口,除此之外它们之间都是互不影响且独立存在的,可以根据需要对自身作出修改。

  • 可以随时添加或删除观察者。

  • 这种模式下,可以在很少甚至不修改主题或观察者的情况下进行对象之间高效的数据发送。

其他注意点:

  • 观察者模式中是可以有多个主题和多个观察者之间的对应关系的,但是一定要弄清楚它们之间的关系以及变化,不然就会变得非常复杂。

  • 一般情况是由主题来触发“通知”方法的,但是在特殊情况下也可以由观察者来触发“通知”方法。

简单示例:


from abc import ABCMeta, abstractmethod

class Publisher:
 """被观察者:发布/订阅关系中的发布对象"""
 def __init__(self):
   self.subscribers = []
   self.latest_content = None

def set_content(self, content):
   """有新消息时,发布新的消息"""
   self.latest_content = content
   self.publish()

def get_latest_content(self):
   """获取最新的消息"""
   return self.latest_content

def register(self, subscriber):
   """注册一个新的订阅者"""
   self.subscribers.append(subscriber)

def publish(self):
   """发布消息并通知订阅的用户"""
   for subscriber in self.subscribers:
     subscriber.notify()

class Subscriber(metaclass=ABCMeta):
 """观察者的抽象类:需要定义一个通知接口,用于发布对象通知订阅的用户"""
 @abstractmethod
 def notify(self):
   pass

class SubscriberA(Subscriber):
 """观察者A:发布/订阅关系中的订阅者,当订阅的发布者有新的变化或动态的时候能及时收到通知"""
 def __init__(self):
   self.my_publisher = None

def subscribe(self, publisher):
   """订阅并进行注册"""
   self.my_publisher = publisher
   self.my_publisher.register(self)

def notify(self):
   """获取最新消息"""
   latest_content = self.my_publisher.get_latest_content()
   print(self, latest_content)

class SubscriberB(Subscriber):
 """观察者B:发布/订阅关系中的订阅者,当订阅的发布者有新的变化或动态的时候能及时收到通知"""
 def __init__(self):
   self.my_publisher = None

def subscribe(self, publisher):
   """订阅并进行注册"""
   self.my_publisher = publisher
   self.my_publisher.register(self)

def notify(self):
   """获取最新消息"""
   latest_content = self.my_publisher.get_latest_content()
   print(self, latest_content)

if __name__ == '__main__':
 new_publisher = Publisher()
 subscriber_a = SubscriberA()
 subscriber_a.subscribe(new_publisher)
 subscriber_b = SubscriberB()
 subscriber_b.subscribe(new_publisher)
 new_publisher.set_content('This is a new message!')

来源:https://www.cnblogs.com/guyuyun/p/11893259.html

标签:python,观察者模式
0
投稿

猜你喜欢

  • Python实现微信翻译机器人的方法

    2022-11-27 08:35:21
  • 解析:安装 MySQL时如何选择安装软件包

    2008-12-31 17:15:00
  • Google logo “我的中国”谷歌国际少年绘画大赛小学1-3年级

    2008-12-19 12:26:00
  • XHTML代码的基本应用

    2007-10-26 12:32:00
  • python编程实现清理微信重复缓存文件

    2022-06-20 02:12:12
  • Python中的Selenium异常处理

    2021-08-28 04:15:23
  • Python实战之画哆啦A梦(超详细步骤)

    2021-05-16 14:36:47
  • python2.7 安装pip的方法步骤(管用)

    2022-02-11 06:28:43
  • 如何使用PyTorch实现自由的数据读取

    2022-06-16 12:28:16
  • asp如何在线更改密码?

    2010-06-26 12:22:00
  • 符合网站标准的图片切换代码(天极软件)

    2008-02-20 08:23:00
  • Python web如何在IIS发布应用过程解析

    2022-10-17 16:02:51
  • vbScript on error resume next容错使用心得

    2010-06-26 19:28:00
  • http状态码一览表以及HTTP响应的返回头信息

    2010-03-31 14:45:00
  • Python中处理字符串之endswith()方法的使用简介

    2023-02-25 09:05:36
  • FCKeditor新版本发布,并更名为CKeditor

    2009-09-08 13:09:00
  • ASP利用TCPIP.DNS组件实现域名IP查询

    2010-02-26 11:25:00
  • 浅析python的Lambda表达式

    2021-11-16 23:51:19
  • ORACLE常见错误代码的分析与解决(一)

    2010-08-02 13:20:00
  • YUI学习笔记(2)

    2009-01-21 16:11:00
  • asp之家 网络编程 m.aspxhome.com