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

2024-简单点-观察者模式

先看代码:

# 导入未来模块以支持类型注解
from __future__ import annotations# 导入抽象基类模块和随机数生成器
from abc import ABC, abstractmethod
from random import randrange# 导入列表类型注解
from typing import List# 定义观察者模式中的主体接口(Subject)
class Subject(ABC):"""主体接口声明一组用于管理订阅者的方法。"""@abstractmethoddef attach(self, observer: Observer) -> None:"""将观察者附加到主体。"""pass@abstractmethoddef detach(self, observer: Observer) -> None:"""从主体中移除观察者。"""pass@abstractmethoddef notify(self) -> None:"""通知所有观察者有关事件的信息。"""pass# 定义具体主体类(ConcreteSubject)
class ConcreteSubject(Subject):"""具体主体拥有对所有订阅者至关重要的状态,并在状态变化时通知观察者。"""_state: int = None"""为了简化起见,主体的状态(对所有订阅者至关重要)存储在此变量中。"""_observers: List[Observer] = []"""订阅者列表。在实际应用中,订阅者列表可以更全面地存储(按事件类型分类等)。"""def attach(self, observer: Observer) -> None:print("主体:已附加一个观察者。")self._observers.append(observer)def detach(self, observer: Observer) -> None:self._observers.remove(observer)"""订阅管理方法。"""def notify(self) -> None:"""触发每个订阅者的更新。"""print("主体:正在通知观察者...")for observer in self._observers:observer.update(self)def some_business_logic(self) -> None:"""通常,订阅逻辑只是主体所能做的工作的一部分。主体通常包含一些重要的业务逻辑,当即将发生(或已经发生)重要事情时触发通知方法。"""print("\n主体:我正在做一些重要的事情。")self._state = randrange(0, 10)print(f"主体:我的状态刚刚变更为:{self._state}")self.notify()# 定义观察者接口(Observer)
class Observer(ABC):"""观察者接口声明由主体使用的update方法。"""@abstractmethoddef update(self, subject: Subject) -> None:"""接收主体的更新。"""pass# 定义具体观察者类(ConcreteObserverA 和 ConcreteObserverB)
"""
具体观察者对它们所附属的主体发出的更新做出反应。
"""class ConcreteObserverA(Observer):def update(self, subject: Subject) -> None:if subject._state < 3:print("具体观察者A:对事件作出反应")class ConcreteObserverB(Observer):def update(self, subject: Subject) -> None:if subject._state == 0 or subject._state >= 2:print("具体观察者B:对事件作出反应")# 客户端代码
if __name__ == "__main__":subject = ConcreteSubject()observer_a = ConcreteObserverA()subject.attach(observer_a)observer_b = ConcreteObserverB()subject.attach(observer_b)subject.some_business_logic()subject.some_business_logic()subject.detach(observer_a)subject.some_business_logic()

输出

Subject: Attached an observer.
Subject: Attached an observer.Subject: I'm doing something important.
Subject: My state has just changed to: 0
Subject: Notifying observers...
ConcreteObserverA: Reacted to the event
ConcreteObserverB: Reacted to the eventSubject: I'm doing something important.
Subject: My state has just changed to: 5
Subject: Notifying observers...
ConcreteObserverB: Reacted to the eventSubject: I'm doing something important.
Subject: My state has just changed to: 0
Subject: Notifying observers...
ConcreteObserverB: Reacted to the event

在这里插入图片描述
参考:
参考

相关文章:

2024-简单点-观察者模式

先看代码&#xff1a; # 导入未来模块以支持类型注解 from __future__ import annotations# 导入抽象基类模块和随机数生成器 from abc import ABC, abstractmethod from random import randrange# 导入列表类型注解 from typing import List# 定义观察者模式中的主体接口&…...

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA&#xff1a;Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的&#xff0c;都是STM32中的一个外设。串口是用来发送通信数据的&#xff0c;而DMA则是用来把数据从一个地方搬到另一个地方&#xff0c;而且不占用CPU。…...

【JavaEE初阶系列】——网络编程 TCP客户端/服务器 程序实现

目录 &#x1f6a9;TCP流套接字编程 &#x1f36d;ServerSocket API &#x1f36d;Socket API &#x1f36d;TCP服务器 &#x1f36d;TCP客户端 &#x1f6a9;TCP流套接字编程 俩个关键的类 ServerSocket (给服务器使用的类&#xff0c;使用这个类来绑定端口号&#xff0…...

CMake构建OpenCv并导入QT项目过程中出现的问题汇总

前言 再此之前请确保你的环境变量是否配置&#xff0c;这是总共需要配置的环境变量 E:\cmake\bin E:\OpenCv\opencv\build\x64\vc15\bin F:\Qt\Tools\mingw730_64\bin F:\Qt\5.12.4\mingw73_64\bin 问题一&#xff1a; CMake Error: CMake was unable to find a build program…...

AcWing 796. 子矩阵的和——算法基础课题解

AcWing 796. 子矩阵的和 题目描述 输入一个 n 行 m 列的整数矩阵&#xff0c;再输入 q 个询问&#xff0c;每个询问包含四个整数 x1,y1,x2,y2&#xff0c;表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n&…...

macos 查看 远程服务器是否开放某个端口

想要使用mac查看远程服务器某个端口是否开发&#xff0c;可通过 nc 命令&#xff0c;如下&#xff1a; nc -zv <服务器IP> <端口号>如果该端口开发&#xff0c;结果为&#xff1a;succeeded! Connection to <服务器IP> port <端口号> [类型] succeed…...

GraphQL注入

GraphQL概述 GraphQL是一种查询语言&#xff0c;用于API设计和数据交互&#xff0c;不仅仅用于查询数据库。GraphQL 允许客户端在一个请求中明确地指定需要的数据&#xff0c;并返回预期的结果&#xff1b;并且将数据查询和数据修改分离开&#xff0c;大大增加灵活性。GraphQL…...

以太坊源码阅读01

正所谓区块链&#xff0c;怎能不熟悉区块的数据结构呢&#xff1f;区块的结构体被保存在core/types/block.go文件中&#xff0c;下面是我截取出来的&#xff1a; type Block struct {header *Headeruncles []*Headertransactions Transactionswithdrawals Withdr…...

Spark-Scala语言实战(15)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的学习键值对方法中的lookup&#xff0c;cogroup两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#…...

【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束

先看效果&#xff1a; 1.js注入拦截&#xff1a; 2.sql注入拦截 生效只需要两步&#xff1a; 1.创建Filter类&#xff0c;粘贴如下代码&#xff1a; package cn.你的包命.filter; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IO…...

【微信小程序】canvas开发笔记

【微信小程序】canvasToTempFilePath:fail fail canvas is empty 看说明书 最好是先看一下官方文档点此前往 如果是canvas 2d 写canvas: this.canvas,&#xff0c;如果是旧版写canvasId: ***, 解决问题 修改对应的代码&#xff0c;如下所示&#xff0c;然后再试试运行&#x…...

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

1 Abstract TripoSR的核心是一个基于变换器的架构&#xff0c;专为单图像3D重建设计。它接受单张RGB图像作为输入&#xff0c;并输出图像中物体的3D表示。TripoSR的核心包括&#xff1a;图像编码器、图像到三平面解码器和基于三平面的神经辐射场&#xff08;NeRF&#xff09;。…...

u盘为什么一插上电脑就蓝屏,u盘一插电脑就蓝屏

u盘之前还好好的&#xff0c;可以传输文件&#xff0c;使用正常&#xff0c;但是最近使用时却出现问题了。只要将u盘一插入电脑&#xff0c;电脑就显示蓝屏。u盘为什么一插上电脑就蓝屏呢?一般&#xff0c;导致的原因有以下几种。一&#xff0c;主板的SATA或IDE控制器驱动损坏…...

【Redis】redis面试相关积累

Redis到底是多线程还是单线程&#xff1f; Redis 在设计上是单线程的&#xff0c;这意味着 Redis 服务器在任何给定时刻只能执行一个命令。然而&#xff0c;这并不意味着 Redis 无法利用多核 CPU&#xff0c;因为 Redis 使用了一些技术来提高性能和并发性&#xff0c;例如非阻…...

【Linux】进程的状态(运行、阻塞、挂起)详解,揭开孤儿进程和僵尸进程的面纱,一篇文章万字讲透!!!!进程的学习②

目录 1.进程排队 时间片 时间片的分配 结构体内存对齐 偏移量补充 对齐规则 为什么会有对齐 2.操作系统学科层面对进程状态的理解 2.1进程的状态理解 ①我们说所谓的状态就是一个整型变量&#xff0c;是task_struct中的一个整型变量 ②.状态决定了接下来的动作 2.2运行状态 2.…...

前端js基础知识(八股文大全)

一、js的数据类型 值类型(基本类型)&#xff1a;数字(Number)、字符串&#xff08;String&#xff09;、布尔(Boolean)、对空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol,大数值类型(BigInt) 引用数据类型&#xff1a;对象(Object)、数组…...

316_C++_xml文件解析成map,可以放到表格上 + xml、xlsx文件互相解析

xml文件例如&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <TrTable> <tr id"0" label"TR_PB_CH" text"CH%2"/> <tr id"4" label"TR_PB_CHN"…...

未来汽车硬件安全的需求(2)

目录 4.汽车安全控制器 4.1 TPM2.0 4.2 安全控制器的硬件保护措施 5. EVITA HSM和安全控制器结合 6.小结 4.汽车安全控制器 汽车安全控制器是用于汽车工业安全关键应用的微控制器。 他们的保护水平远远高于EVITA HSM。今天的典型应用是移动通信&#xff0c;V2X、SOTA、…...

html+javascript,用date完成,距离某一天还有多少天

图片展示: html代码 如下: <style>* {margin: 0;padding: 0;}.time-item {width: 500px;height: 45px;margin: 0 auto;}.time-item strong {background: orange;color: #fff;line-height: 100px;font-size: 40px;font-family: Arial;padding: 0 10px;margin-right: 10px…...

跟bug较劲的第n天,undefined === undefined

前情提要 场景复现 看到这张图片&#xff0c;有的同学也许不知道这个冷知识&#xff0c;分享一下&#xff0c;是因为我在开发过程中踩到的坑&#xff0c;花了三小时排查出问题的原因在这&#xff0c;你们说值不值。。。 我分享下我是怎么碰到的这个问题&#xff0c;下面看代码…...

数据结构_基于链表的通讯录

顺序表的源代码需要略作修改&#xff0c;如下 将数据类型改为通讯录的结构体。注释掉打印&#xff0c;查找的函数。 SList.h #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"Contact.h"ty…...

jenkins+gitlab配置

汉化 1、安装Localization: Chinese (Simplified)插件 &#xff08;此处我已安装&#xff09; &#xff08;安装完成后重启jenkins服务即可实现汉化&#xff09; 新增用户权限配置 1、安装插件 Role-based Authorization Strategy 2、全局安全配置 3、配置角色权限 4、新建…...

【Labview】虚拟仪器技术

一、背景知识 1.1 虚拟仪器的定义、组成和应用 虚拟仪器的特点 虚拟仪器的突出特征为“硬件功能软件化”&#xff0c;虚拟仪器是在计算机上显示仪器面板&#xff0c;将硬件电路完成信号调理和处理功能由计算机程序完成。 虚拟仪器的组成 硬件软件 硬件是基础&#xff0c;负责将…...

IvorySQL 3.2原理解析|与Oracle 12c XML函数兼容性的实现机制

[发行日期&#xff1a;2024年4月11日] IvorySQL 3.2基于PostgreSQL 16.2&#xff0c;引入了多种Oracle XML函数的全面兼容性功能&#xff0c;同时修复了多个问题&#xff0c;更多信息请参考文档网站。 >>>新版本体验链接&#xff1a; https://docs.ivorysql.org/cn…...

SpringBoot + Dobbo + nacos

SpringBoot Dobbo nacos 一、nacos https://nacos.io/zh-cn/docs/quick-start.html 1、下载安装包 https://github.com/alibaba/nacos/releases/下载后在主目录下&#xff0c;创建一个logs的文件夹&#xff1a;用来存日志 2、启动nacos 在bin目录下打开cmd运行启动命令&a…...

学习笔记-微服务基础(黑马程序员)

框架 spring cloudspring cloud alibaba Eureka eureka-server 注册中心 eureka-client 客户端每30s发送心跳服务 服务消费者服务提供者 server 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-star…...

每日Bug汇总--Day05

Bug汇总—Day05 一、项目运行报错 二、项目运行Bug 1、**问题描述&#xff1a;**前端将从后台查询的数据作为参数进行get请求&#xff0c;参数为空 原因分析&#xff1a; 这种写法可能只支全局的参数调用方法的传参响应 代码实现 if (this.jishiName) {this.$http({url…...

docker、ctr、crictl命令对比

命令dockerctr&#xff08;containerd&#xff09;crictl&#xff08;kubernetes&#xff09;查看运行的容器docker psctr task ls/ctr container lscrictl ps查看镜像docker imagesctr image lscrictl images查看容器日志docker logs无crictl logs查看容器数据信息docker insp…...

uniapp 编译后分包下静态图片404问题解决方案

如上图官方说明&#xff1a; 在分包下建立一个static文件夹即可&#xff1a; 分包内代码引用图片 <image src"/分包名称/img/图片名称"></image> <image src"/dataView/img/图片名称"></image>...

第十二届蓝桥杯大赛软件赛省赛Java 大学 B 组题解

1、ASC public class Main {public static void main(String[] args) {System.out.println(...

江门网站制作/2019网站seo

之前用过一些编辑器如SublimeText&#xff0c;IDE如phpstorm&#xff0c;IDEA等&#xff1b;这些工具给我的感觉就是&#xff0c;除了给予这些工具应有的功能外&#xff0c;给予开发者更友好&#xff0c;更舒服的界面。Eclipse很早就开始使用了&#xff0c;之前在使用时&#x…...

wordpress 仿站/百度一下你就知道官网新闻

Java基础之&#xff1a;集合——Collection——ListList简单介绍List接口是Collection的子接口。List集合是有序的(输入和输出顺序不变)&#xff0c;且允许重复元素存在。List集合每个元素都有其对应的顺序索引&#xff0c;即List支持索引。List使用及常用方法首先是所有Collec…...

英文网站备案/做网页用什么软件好

目录 系统环境 步骤 1.安装docker 2.安装Docker-compose 3.安装GitLab 系统环境 Ubuntudocker (Docker version 19.03.12, build 48a66213fe)docker-compose 步骤 1.安装docker 1.在一个新的宿主机安装docker之前先设置docker的仓库 $ sudo apt-get update $ sudo ap…...

无锡网站建设系统/网站设计公司网站制作

前言 会议定点&#xff1a;新主楼F座教室会议时间&#xff1a;2019/5/5会议目的&#xff1a;确定进度&#xff0c;分配下阶段任务一、任务进度 组员上周任务进度下阶段任务大娃初步完成新增的模型代码完善新增层的代码二娃阅读后端文档&#xff0c;辅助主PM维护github项目&…...

做网站的怎么赚钱/seo招聘网

Combogrid 是一个jQuery插件用于为输入框添加高级自完成功能&#xff08;auto-complete&#xff09;。当用户输入的时候&#xff0c;会在输入框的下方面动态显示一个拥有分页功能 的表格&#xff08;Grid&#xff09;控件。 通过Ajax请求&#xff0c;然后结果以JSON&#xff08…...

ih5网站制作平台/百度首页百度一下

用oracle sql对数字进行操作: 取上取整、向下取整、保留N位小数、四舍五入、数字格式化取整&#xff08;向下取整&#xff09;&#xff1a; select floor(5.534) from dual;select trunc(5.534) from dual;上面两种用法都可以对数字5.534向下取整&#xff0c;结果为5. 如果要向…...