【Python笔记-设计模式】观察者模式

一、说明

观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知“监控”该对象的其他对象。

(一) 解决问题

主要解决一个对象的状态变化时,需要通知其他对象,并且这些被通知的对象可能是多个且不确定的。

(二) 使用场景

  • 应用中的一些对象必须观察其他对象状态并进行操作时,如消息订阅、动态推送
  • 当一个对象状态的改变需要改变其他对象,或实际对象是事先未知的或动态变化的时

二、结构

  1. 发布者(Publisher)会向其他对象发送值得关注的事件。事件会在发布者自身状态改变或执行特定行为后发生。发布者中包含一个允许新订阅者加入和当前订阅者离开列表的订阅构架。
  2. 当新事件发生时,发送者会遍历订阅列表并调用每个订阅者对象的通知方法。该方法是在订阅者接口中声明的。
  3. 订阅者(Subscriber)接口声明了通知接口。在绝大多数情况下,该接口仅包含一个update更新方法。该方法可以拥有多个参数,使发布者能在更新时传递事件的详细信息。
  4. 具体订阅者(ConcreteSubscribers)可以执行一些操作来回应发布者的通知。所有具体订阅者类都实现了同样的接口,因此发布者不需要与具体类相耦合。
  5. 订阅者通常需要一些上下文信息来正确地处理更新。因此,发布者通常会将一些上下文数据作为通知方法的参数进行传递。发布者也可将自身作为参数进行传递,使订阅者直接获取所需的数据。
  6. 客户端(Client)会分别创建发布者和订阅者对象,然后为订阅者注册发布者更新。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
观察者模式例:股票价格监控,当股票价格变化时,通知所有订阅者
"""from abc import ABC, abstractmethod
from typing import Listclass Subject(ABC):"""发布者基类"""@abstractmethoddef register_observer(self, observer):pass@abstractmethoddef remove_observer(self, observer):pass@abstractmethoddef notify_observers(self):passclass Observer(ABC):"""订阅者基类"""@abstractmethoddef update(self):passclass StockPriceSubject(Subject):"""具体发布者"""def __init__(self):self._observers: List[Observer] = []self._price = 0.0def register_observer(self, observer):self._observers.append(observer)def remove_observer(self, observer):self._observers.remove(observer)def notify_observers(self):for observer in self._observers:observer.update()def set_price(self, price):self._price = priceself.notify_observers()def get_price(self):return self._priceclass Investor(Observer):"""具体订阅者"""def __init__(self, name, subject):self._name = nameself._subject = subjectdef update(self):price = self._subject.get_price()print(f"{self._name} 收到新价格: {price}")if __name__ == "__main__":"""张三 收到新价格: 100.0李四 收到新价格: 100.0------------------------------张三 收到新价格: 110.0"""stock_subject = StockPriceSubject()investor1 = Investor("张三", stock_subject)investor2 = Investor("李四", stock_subject)stock_subject.register_observer(investor1)stock_subject.register_observer(investor2)# 股票变动自动通知订阅者stock_subject.set_price(100.0)print("-" * 30)# 李四取消订阅订阅stock_subject.remove_observer(investor2)stock_subject.set_price(110.0)

四、优缺点

优点

  • 开闭原则:可以在不修改主题和观察者类的情况下增加新的观察者
  • 主题和观察者之间是松耦合的:主题对象不需要知道观察者的具体实现,只需要知道观察者接口即可。这样可以降低对象之间的耦合度,使得系统更加灵活。

缺点

  • 如果观察者很多,通知所有观察者可能会导致性能问题。
  • 如果观察者和主题之间有循环依赖,可能会导致系统复杂性增加。

【Python笔记】设计模式-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/497158.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Dubbo】什么是Dubbo?它的架构和负载均衡策略,以及zookeeper宕机与dubbo直连的情况

目录 一 重要的概念 1.1 什么是 Dubbo? 1.2 什么是 RPC?RPC原理是什么? 1.3 为什么要用 Dubbo? 1.4 什么是分布式? 1.5 为什么要分布式? 二 Dubbo 的架构 2.1 Dubbo 的架构图解 2.2 Dubbo 工作原理 三 Dubbo 的负载均衡策略 3.1 先来解释一下什么是负载均衡 3…

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中,很多网友都反馈过想要在目标检测的图片上,显示计数功能。其实官方已经实现了这个功能,只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程,教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…

德人合科技 | 天锐绿盾终端安全管理系统

德人合科技提到的“天锐绿盾终端安全管理系统”是一款专业的信息安全防泄密软件。这款软件基于核心驱动层,为企业提供信息化防泄密一体化方案。 www.drhchina.com 其主要特点包括: 数据防泄密管理:天锐绿盾终端安全管理系统能够确保数据在创…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示,用户网络 1 通过 LSW1 与 Switch 相连, Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连, Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数,对 VLAN2 进…

【MySQL】主从同步原理、分库分表

主从同步原理 1. 主从同步原理 MySQL 经常先把命令拷入硬盘的日志,再执行日志的命令,这样的好处: 日志的位置固定,拷入硬盘的开销不大;将命令先准备好,而不是边读边执行,性能更好,…

Android 9.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在9.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读)

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读) 本文提出的方法很简单,将原始图像增加其他随机图像的高频信息,得到增强的图像作为新的样本,与原始的样本交替训练。背后的动机是,vln模型对高频信息…

nginx之重写功能 模块指令 防盗链

一 重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求, 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是 nginx服务器的重要功能之一,重写功…

【重要公告】BSV区块链协会全新推出“网络访问规则NAR”

​​发表时间:2024年2月15日 BSV区块链协会正式宣布已为BSV区块链推出一套全新的网络访问规则(Network Access Rules,以下简称“NAR”)。 NAR是一整套规则,用于规范BSV协会与BSV网络节点之间的关系。它基于比特币最初…

云计算与大数据课程笔记(一)云计算背景与介绍

如何实现一个简易搜索引擎? 实现一个简易的搜索引擎可以分为几个基本步骤:数据收集(爬虫)、数据处理(索引)、查询处理和结果呈现。下面是一个概括的实现流程: 1. 数据收集(爬虫&am…

SpringCloud Eureka(注册中心)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基…

论文笔记:A survey on zero knowledge range proofs and applications

https://link.springer.com/article/10.1007/s42452-019-0989-z 描述了构建零知识区间证明(ZKRP)的不同策略,例如2001年Boudot提出的方案;2008年Camenisch等人提出的方案;以及2017年提出的Bulletproofs。 Introducti…