当前位置: 首页 > news >正文

【Python3】观察者模式

观察者模式(Observer Pattern)是一种常见的设计模式,用于定义对象之间的一对多依赖关系,使得一个对象的状态改变能够通知所有依赖于它的对象并自动更新。

在观察者模式中,有两个核心角色:

  1. Subject(主题):也称为被观察者,它维护一组观察者对象,并提供添加、删除和通知观察者的方法。当主题状态发生变化时,会通知所有注册的观察者。

  2. Observer(观察者):观察主题的对象,当主题状态发生变化时,观察者会接收到更新通知,并进行相应的处理操作。

观察者模式的优点包括:

  • 解耦性:主题和观察者之间是松耦合的关系,主题无需知道观察者的具体实现,只需通知观察者即可。
  • 可扩展性:可以方便地增加新的观察者或主题,而不影响已有代码。
  • 通知机制:观察者模式提供了一种简单且可靠的通知机制,确保观察者能及时获得主题状态的变化。

在实际应用中,观察者模式被广泛应用于GUI编程、事件处理机制、发布订阅系统等场景,其中对象间的状态变化需要被动态通知其他对象。

class Subject:def __init__(self):self._observers = []def attach(self, observer):if observer not in self._observers:self._observers.append(observer)def detach(self, observer):try:self._observers.remove(observer)except ValueError:passdef notify(self, message):for observer in self._observers:observer.update(message)class Observer:def update(self, message):print("Received message:", message)# 创建主题和观察者对象
subject = Subject()
observer1 = Observer()
observer2 = Observer()# 将观察者对象注册到主题
subject.attach(observer1)
subject.attach(observer2)# 发送通知
subject.notify("Hello, observers!")# 分离观察者对象
subject.detach(observer2)# 再次发送通知
subject.notify("Another message")

在上面的示例中,我们首先定义了 Subject 类和 Observer 类。Subject 类维护了一组观察者对象,并提供了注册、注销和通知观察者的方法。Observer 类定义了观察者对象,其中包含了更新方法 update

然后,我们创建了一个主题对象和两个观察者对象,并将观察者对象注册到主题。随后,我们通过主题对象发送通知,并观察观察者对象的响应。

相关文章:

【Python3】观察者模式

观察者模式(Observer Pattern)是一种常见的设计模式,用于定义对象之间的一对多依赖关系,使得一个对象的状态改变能够通知所有依赖于它的对象并自动更新。 在观察者模式中,有两个核心角色: Subject&#xf…...

HTML5 Web Worker之性能优化

描述 由于 JavaScript 是单线程的,当执行比较耗时的任务时,就会阻塞主线程并导致页面无法响应,这就是 Web Workers 发挥作用的地方。它允许在一个单独的线程(称为工作线程)中执行耗时的任务。这使得 JavaScript 代码可…...

应对恶意IP攻击的有效方法

在当今数字化时代,网络攻击已经成为了互联网安全的重大挑战之一。恶意IP攻击是网络安全领域中的一种常见威胁,它可能导致数据泄露、服务中断、系统瘫痪等严重后果。因此,有效地应对恶意IP攻击至关重要。IP数据云将深入探讨如何应对恶意IP攻击…...

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1,运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件, 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…...

Rocky Linux - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Redhat Linux版环境发布之后,近日我又制作了基于Rocky Enterprise Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primav…...

API 管理调研

当前大部分团队内 API 管理都是依赖 Postman,postman最大的问题是共享问题,如果我要使用另外一个人已经调试好的 API 非常麻烦。因此,能实现协作的 API 管理将极大提升效率。 Yapi https://github.com/YMFE/yapi https://hellosean1025.gi…...

在centOS服务器安装docker,并使用docker配置nacos

遇到安装慢的情况可以优先选择阿里镜像 安装docker 更新yum版本 yum update安装所需软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep…...

JVM运行时数据区概述以及分别存放的内容

JVM的运行时数据区是JVM在执行Java程序时用于存储数据和状态信息的内存区域。它分为多个部分,每个部分都有其特定的作用和存放的内容。 1. 方法区(Method Area) 作用:方法区是所有线程共享的内存区域,用于存放已被虚…...

数据体系规范化

基础是标准化、规范化 建立数据仓库,面向主题的、集成的、相对稳定的、反映历史变化的数据集合,以支持管理决策decision making 大数据:大量volumn、多样variety、快速velocity、价值密度低value、准确性veracity、可视化visualization、合法性validity 多源数据、多样数…...

从政府工作报告探计算机行业发展

从政府工作报告中,我们可以深入洞察计算机行业在未来一年的发展趋势和政策导向。报告中明确提出了数字经济创新发展的重要性,以及制造业数字化转型、服务业数字化、智慧城市和数字乡村建设等关键任务,这些都为计算机行业提供了广阔的发展空间…...

【软件工具】网络性能测试工具 Iperf

Iperf 是一款专业的开源网络性能测试工具,它被广泛用于测量网络带宽、延迟、抖动和数据包丢失等网络性能指标,支持 TCP 和 UDP 等,可用于点对点或客户端-服务器等模式的网络测试。 软件获取 官方下载地址:https://iperf.fr/iper…...

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架…...

C语言下使用SQL语言

需头文件&#xff1a;#include<sqlite.h>---需下载 1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(…...

Gitea相关漏洞

Go代码审计&#xff1a;Gitea远程命令执行漏洞链_新闻中心-网盾网络安全培训学校 Vulhub靶场gitea-1.4远程代码执行漏洞复现_gitea 漏洞-CSDN博客...

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址&#xff1a; https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾&#xff0c;使用的网络为unet&#xff0c; 网络代码&#xff1a; import torch import torch.nn as nn from torchsumm…...

使用JS的for循环实现九九乘法表

九九乘法表是我们在学习基础数学时经常会遇到的一个概念。在编程中&#xff0c;使用循环结构来实现九九乘法表是一个很好的练习。下面&#xff0c;我将详细介绍如何使用JavaScript的for循环来实现九九乘法表。 首先&#xff0c;我们需要理解for循环的基本结构。在JavaScript中…...

Leetcode 70 爬楼梯

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到…...

基于SpringBoot+MYSQL+Vue的校园管理系统

目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、操作流程 3.2、添加信息流程 3.3、删除信息流程 4、系统设计 4.1 系统体系结构 4.2开发流程设计 4.3 数据库设计原则 4.4 数据表 5、运行截图(部分) 5.1管理员功能模块 5.2用户功能模块 5.3院校管理员功能模块…...

Oracle P6 负浮时和必须完成日期

前言 学习过计划的人大都有这有这样的经历&#xff0c;即无论是Microsoft Project 亦或是P6见过负浮时那么 Primavera P6 计划中的负浮时是从何而来的呢&#xff0c;那么本文可能会有所帮助。 首先&#xff0c;当活动的最晚日期早于最早日期时&#xff0c;就会出现负浮时。 换…...

【C++】STL--String

这一节主要总结string类的常见接口&#xff0c;以及完成了string类的模拟实现。 目录 标准库的String类 string类常见接口 string类对象的常见构造 string析构函数&#xff1a;~string string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作 s…...

Infineon BGT60TR13C毫米波雷达Arduino底层驱动详解

1. 项目概述Infineon XENSIV™ BGT60TR13C 是一款集成化60 GHz毫米波雷达传感器芯片&#xff0c;专为低功耗、高精度运动检测与距离测量应用而设计。该器件采用单片集成方案&#xff0c;将60 GHz VCO、发射/接收前端、三通道接收链路&#xff08;含LNA、Mixer、IF VGA&#xff…...

【数据结构与算法】第24篇:哈夫曼树与哈夫曼编码

一、基本概念1.1 带权路径长度在二叉树中&#xff1a;路径长度&#xff1a;从一个节点到另一个节点经过的边数带权路径长度(WPL)&#xff1a;所有叶子节点的权重 路径长度 之和示例&#xff1a;text叶子节点&#xff1a;A(7), B(5), C(2), D(4)普通树&#xff1a;15/ \7 8/…...

单相级联H桥(CHB)多电平变换器并网仿真,网侧电压220V PR电压外环 ,PI电流内环,有...

单相级联H桥&#xff08;CHB&#xff09;多电平变换器并网仿真&#xff0c;网侧电压220V PR电压外环 &#xff0c;PI电流内环&#xff0c;有独立的电容电压平衡控制&#xff0c;使用三个全桥子模块&#xff0c;可输出7电平&#xff0c;可供参考学习单相级联H桥多电平变换器这…...

国内大模型托管平台推荐:四大平台选型指南

随着大模型技术加速落地&#xff0c;模型托管平台已成为开发者不可或缺的基础设施。本文梳理了2025年国内主流的四大大模型托管平台&#xff0c;从核心优势、适用场景到选型建议&#xff0c;为你提供一份实用的选型指南。一、模力方舟&#xff1a;国产开源生态的“基石”推荐指…...

中航迈特光束整形金属3D打印技术取得重要进展,多种材料已成功验证

中航迈特在金属3D打印装备研发方面持续发力&#xff0c;尤其是光束整形技术近期取得重要进展。在本届TCT亚洲展&#xff0c;它推出的MT280搭载了无级点环光斑能量智调系统&#xff0c;是光束整形金属3D打印当前较新的看点。据3D打印技术参考了解&#xff0c;无级点环光斑能量智…...

ORA-12518:Oracle 监听程序无法分发客户端连接原因及解决方法

本文主要讲解ORA-12518:Oracle监听程序无法分发客户端连接的原因分析及解决方法。问题描述数据中台的同步任务有时会报错如下&#xff1a;ORA-12518, TNS:listener could not hand off client connection。意即Oracle监听程序无法分发客户端连接&#xff0c;原因分析只是有时候…...

第4章 Mosquitto命令行工具快速上手

第4章 Mosquitto命令行工具快速上手 4.1 命令行工具概览 #mermaid-svg-J8aIvd39QR9TuYWA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-…...

MATLAB 实现轴承振动信号模拟:从动力学方程到故障仿真

MATLAB matlab 轴承振动信号模拟 轴承动力学方程 滚动轴承动力学模型&#xff0c;轴承动力学模型&#xff1a;滚动轴承运动学模型&#xff0c;深沟球轴承故障基于Hertz接触理论&#xff0c;采用龙格库塔方法可根据需求仿真轴承正常状态&#xff0c;外圈、内圈以及滚动体的故障…...

Blender场景教程:秘密实验室

BY:Express the Chaos关于我做了5年视觉设计师&#xff0c;但没有正式的3D背景。我十一个月前养成了通过概念艺术和3D表达自己的习惯&#xff0c;不得不向Blender介绍自己&#xff08;因为它是免费软件&#xff0c;我忍不住要用&#xff09;&#xff0c;以及制作3D场景的整个机…...

3.30作业

例图及要求&#xff1a;分析&#xff1a;1、配置各个交换机接口2、全网仅有两个网段&#xff0c;PC1和PC3在一个网段&#xff0c;PC2、PC4、PC5和PC6在一个网段3、路由器配置互联接口4、AR1上配置DHCP服务5、各个主机间相互ping通成果&#xff1a;...