当前位置: 首页 > 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

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

http://www.lryc.cn/news/337413.html

相关文章:

  • STM32—DMA直接存储器访问详解
  • 【JavaEE初阶系列】——网络编程 TCP客户端/服务器 程序实现
  • CMake构建OpenCv并导入QT项目过程中出现的问题汇总
  • AcWing 796. 子矩阵的和——算法基础课题解
  • macos 查看 远程服务器是否开放某个端口
  • GraphQL注入
  • 以太坊源码阅读01
  • Spark-Scala语言实战(15)
  • 【SpringBoot XSS存储漏洞 拦截器】Java纯后端对于前台输入值的拦截校验实现 一个类加一个注解结束
  • 【微信小程序】canvas开发笔记
  • TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读
  • u盘为什么一插上电脑就蓝屏,u盘一插电脑就蓝屏
  • 【Redis】redis面试相关积累
  • 【Linux】进程的状态(运行、阻塞、挂起)详解,揭开孤儿进程和僵尸进程的面纱,一篇文章万字讲透!!!!进程的学习②
  • 前端js基础知识(八股文大全)
  • 316_C++_xml文件解析成map,可以放到表格上 + xml、xlsx文件互相解析
  • 未来汽车硬件安全的需求(2)
  • html+javascript,用date完成,距离某一天还有多少天
  • 跟bug较劲的第n天,undefined === undefined
  • 数据结构_基于链表的通讯录
  • jenkins+gitlab配置
  • 【Labview】虚拟仪器技术
  • IvorySQL 3.2原理解析|与Oracle 12c XML函数兼容性的实现机制
  • SpringBoot + Dobbo + nacos
  • 学习笔记-微服务基础(黑马程序员)
  • 每日Bug汇总--Day05
  • docker、ctr、crictl命令对比
  • uniapp 编译后分包下静态图片404问题解决方案
  • 第十二届蓝桥杯大赛软件赛省赛Java 大学 B 组题解
  • 关于openai和chatgpt、gpt-4、PyTorch、TensorFlow 两者和Transformers的关系