23种设计模式 - 观察者模式
模式定义
观察者模式(Observer Pattern)是一种行为型设计模式,定义了一对多的依赖关系:当一个对象(称为主题)状态变化时,所有依赖它的对象(称为观察者)会自动收到通知并更新。这种模式广泛用于事件驱动系统,如数控系统中的状态监控。
模式结构
抽象主题(Subject)
- 维护观察者列表,提供添加、删除和通知观察者的接口。
具体主题(ConcreteSubject) - 实现抽象主题接口,存储具体状态(如数控机床的温度、加工状态),并在状态变化时触发通知。
抽象观察者(Observer) - 定义更新接口(如
Update()),供具体观察者实现。
具体观察者(ConcreteObserver) - 实现更新逻辑,响应主题状态变化(如更新监控界面或记录日志)。
适用场景
状态变化触发多组件更新:如数控机床温度超限时通知冷却系统和报警器。
解耦事件源与处理逻辑:避免数控系统各模块直接耦合。
动态订阅机制:允许运行时增减监控模块(如临时添加日志记录器)。
C++示例(数控系统场景)
场景说明:
数控机床运行时,温度传感器检测到温度变化时,需通知监控界面和报警系统。
#include
#include
#include // 抽象观察者
class Observer {
public:virtual ~Observer() = default;virtual void update(float temperature) = 0; // 温度变化时触发
};// 抽象主题:数控机床传感器
class TemperatureSensor {
public:virtual ~TemperatureSensor() = default;virtual void attach(std::shared_ptr observer) = 0;virtual void notify() = 0;
};// 具体主题:温度传感器实现
class ConcreteSensor : public TemperatureSensor {
private:std::vector> observers_;float temperature_ = 25.0f; // 初始温度public:void setTemperature(float temp) {temperature_ = temp;notify(); // 温度变化时通知观察者}void attach(std::shared_ptr observer) override {observers_.push_back(observer);}void notify() override {for (auto& observer : observers_) {observer->update(temperature_);}}
};// 具体观察者1:监控界面
class MonitorUI : public Observer {
public:void update(float temperature) override {std::cout << "监控界面更新:当前温度 " << temperature << "°C\n";}
};// 具体观察者2:高温报警器
class AlarmSystem : public Observer {
public:void update(float temperature) override {if (temperature > 80.0f) {std::cout << "警告:温度超过安全阈值!\n";}}
};// 客户端
int main() {auto sensor = std::make_shared();auto monitor = std::make_shared();auto alarm = std::make_shared();// 注册观察者sensor->attach(monitor);sensor->attach(alarm);// 模拟温度变化sensor->setTemperature(45.0f); // 监控界面更新sensor->setTemperature(85.0f); // 触发报警
}
代码解释
主题与观察者解耦:ConcreteSensor 仅负责通知,不关心观察者的具体逻辑。
动态扩展性:新增观察者(如日志记录器)无需修改主题代码。
数控系统应用:温度变化时,监控界面和报警系统自动响应,符合实时监控需求。
相关文章:
23种设计模式 - 观察者模式
模式定义 观察者模式(Observer Pattern)是一种行为型设计模式,定义了一对多的依赖关系:当一个对象(称为主题)状态变化时,所有依赖它的对象(称为观察者)会自动收到通知并…...
conda、anaconda、pip、pytorch、tensorflow有什么区别?
先画一张图,可以大致看出它们的区别和关联: pytorch、tensorflow都是Python的第三方库,相当于封装的代码工具集库,通过import导入使用。这两个都是深度学习框架,用来搭建AI模型什么的,使用范围非常之广&…...
项目设置内网 IP 访问实现方案
在我们平常的开发工作中,项目开发、测试完成后进行部署上线。比如电商网站、新闻网站、社交网站等,通常对访问不会进行限制。但是像企业内部网站、内部管理系统等,这种系统一般都需要限制访问,比如内网才能访问等。那么一个网站应…...
Vue面试2
1.跨域问题以及如何解决跨域 跨域问题(Cross-Origin Resource Sharing, CORS)是指在浏览器中,当一个资源试图从一个不同的源请求另一个资源时所遇到的限制。这种限制是浏览器为了保护用户安全而实施的一种同源策略(Same-origin p…...
合合信息2025届春季校园招聘全面启动!
世界因你而AI,合合信息2025届春季校园招聘启动! 我们是谁? 我们是一家行业领先的人工智能及大数据科技企业 18年深耕AI领域,C端产品与B端服务布局矩阵完善 9.4亿全球累计用户首次下载量💥 来到这里你能得到什么&a…...
如何利用 Vue 的生命周期钩子进行初始化和清理操作?
一、初始化操作的核心钩子 1. created(选项式API) export default {data() {return { user: null };},created() {// 适合初始化数据、发起非DOM操作请求this.fetchUser();},methods: {async fetchUser() {const response await fetch(/api/user);thi…...
Excell 代码处理
文章目录 Excell 代码处理cvc格式xlsl格式小结 Excell 代码处理 有时候要对excell进行分析,或者数据的导入导出,这个时候如果可以用代码读写分析操作那么会方便很多 cvc格式 CSV(Comma-Separated Values,逗号分隔值)是…...
KMP的next数组构建详解
KMP的next数组构建详解 1. next数组的作用 核心功能:在KMP算法中,当模式串与主串发生不匹配时,next数组决定模式串指针回退的位置,避免无效匹配。 定义:next[i]表示子串s[0...i]的最长公共前后缀长度。例如ÿ…...
Docker 的安全配置与优化(二)
Docker 安全优化策略 (一)多阶段构建优化镜像大小 多阶段构建是 Docker 17.05 版本引入的强大功能,它允许在一个 Dockerfile 中定义多个构建阶段,每个阶段都可以使用不同的基础镜像和依赖项,最终只将必要的文件和依赖…...
shiro代码层面追踪
文章目录 环境漏洞分析硬编码 反序列化Gadget构造 环境 环境搭建:https://blog.csdn.net/qq_44769520/article/details/123476443 漏洞分析 硬编码 shiro是对rememberMe这个cookie进⾏反序列化的时候出现了问题。 相应代码 // // Source code recreated from …...
通信系统中物理层与网络层联系与区别
在通信系统中,物理层和网络层是OSI(开放系统互连)模型中的两个重要层次,分别位于协议栈的最底层和第三层。它们在功能、职责和实现方式上有显著的区别,但同时也在某些方面存在联系。以下是物理层与网络层的联系与区别的…...
虚拟机网络ssh连接失败,没有网络
vscode进行ssh时连接失败,发现是虚拟机没有网络。 虚拟机ping不通www.baidu.com但可以ping通内网 ping 8.8.8.8ping不通。 sudo dhclient -r ens33 sudo dhclient ens33 ip route show可以了。 20250221记录:不知道是不是重启了虚拟机还是咋了&#…...
已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标
已知点矩阵的三个顶点坐标、行列数和行列的间距,计算得出剩余所有点的坐标 计算矩阵中每个点的坐标代码实现案例图调用验证 计算矩阵中每个点的坐标 给定左上角、左下角和右上角三个点的坐标,以及矩阵的行数、列数、行间距和列间距,我们可以…...
Python Cookbook-2.4 从文件中读取指定的行
任务 根据给出的行号,从文本文件中读取一行数据。 解决方案 Python标准库linecache模块非常适合这个任务: import linecache theline linecache.getline(thefilepath, desired_line_number)讨论 对这个任务而言,标准的 linecache 模块是 Python 能…...
go 并发 gorouting chan channel select Mutex sync.One
goroutine // head: 前缀 index:是一个int的指针 func print(head string, index *int) {for i : 0; i < 5; i {// 指针对应的int *indexfmt.Println(*index, head, i)// 暂停1stime.Sleep(1 * time.Second)} }/* Go 允许使用 go 语句开启一个新的运…...
Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
1. 基本算术运算符 算术运算符主要用于对数值类型(整型和浮点型)进行基本的数学运算。以下是常见的算术运算符及其说明: 运算符描述示例结果加法运算符,用于两个数相加,也可用于字符串连接int a 5 3; string str &…...
深度学习入门--python入门2
以前学的全忘了,现在算是才开始学,有错误,恳请指正。 目录 1.4 Python脚本文件 1.4.1保存为文件 1.4.2 类 1.5 Numpy 1.5.1 导入Numpy 1.5.2 生成Numpy数组 1.5.3 Numpy的算术运算 1.5.4 Numpy的N维数组 1.5.5 广播 1.5.6 访问元素…...
题海拾贝:【枚举】P2010 [NOIP 2016 普及组] 回文日期
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞,关注! 1、题…...
Mac端homebrew安装配置
拷打了一下午o3-mini-high,不如这位博主的超强帖子,10分钟结束战斗 跟随该文章即可,2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次,点赞258次,收藏837次。一直觉得自己写…...
Web - JS基础语法与表达式
概述 这篇文章主要介绍了 JavaScript 的基础语法,包括代码书写位置、ERPL 环境、变量(命名规则、默认值、初始化)、数据类型(基本和复杂,及各类型特点、转换)、表达式和运算符(算数、特殊算数、…...
Python高级语法之selenium
目录: 1、selenium的使用2、selenium元素定位3、selenium使用功能Phantomjs模拟浏览器启动4、selenium使用功能ChromsHandless模拟浏览器启动 1、selenium的使用 2、selenium元素定位 3、selenium使用功能Phantomjs模拟浏览器启动 4、selenium使用功能ChromsHandles…...
AIP-148 标准域
编号148原文链接AIP-148: Standard fields状态批准创建日期2020-10-06更新日期2020-10-06 一些概念在任何API集合中都很常用。对于这些概念,使用统一的标准域名字和行为来表达它们,是非常有用的。 指南 标准域 应当 用于描述其相应概念, 不…...
Docker构建时,设定默认进入的工作目录的方法
在 Docker 中,你可以通过不同的方式来设定容器默认进入的目录,以下针对不同场景分别介绍具体方法: 1. 使用 Dockerfile 设定工作目录 如果你是通过构建镜像的方式来运行容器,那么可以在 Dockerfile 中使用 WORKDIR 指令来设置容器启动时的默认工作目录。以下是具体步骤:…...
2025年3月最新算法-鲸鱼迁徙优化算法Whale Migration Algorithm-附Matlab免费代码
引言 本期介绍了一种基于座头鲸协同迁移行为的创新生物启发式优化方法——鲸鱼迁徙优化算法Whale Migration Algorithm,WMA。该算法于2025年3月最新发表在期刊 Results in Engineering 在本节中,我们概述了开发鲸鱼迁移算法(WMA)…...
day56 第十一章:图论part06
108.冗余连接 注意init初始化 改进: 其实只有一条边冗余,改为,如果两条边在同一个集合里,就输出,不然加入。 #include <iostream> #include <vector> using namespace std;int n 1005; vector<int>…...
flowable适配达梦数据库
文章目录 适配相关问题无法从数据库产品名称“DM DBMS”中推断数据库类型分析解决 构建ibatis SqlSessionFactory时出错:inStream参数为null分析解决 liquibase相关问题问题一:不支持的数据库 Error executing SQL call current_schema: 无法解析的成员访…...
Jenkins整合Jmeter实现接口自动化测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、安装jmeter 下载:http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本,启动前修改j…...
高级推理的多样化推理与验证
25年2月来自波士顿大学、NotBadMath.AI、谷歌、哥伦比亚大学、MIT、Intuit公司和斯坦福大学的论文“Diverse Inference and Verification for Advanced Reasoning”。 OpenAI o1、o3 和 DeepSeek R1 等推理 LLM 在数学和编码方面取得重大进展,但仍发现 IMO 组合问题…...
深入理解 MySQL 8 C++ 源码:SELECT MOD(MONTH(NOW()), 2) 的函数执行过程
MySQL 作为最流行的关系型数据库之一,其内部实现机制一直是开发者探索的热点。本文将以一条简单的 SQL 查询 SELECT MOD(MONTH(NOW()), 2) 为例,深入分析 MySQL 8 源码中内置函数 MOD、MONTH 和 NOW 的执行过程,揭示其底层实现逻辑。 一、SQL…...
清华大学:DeepSeek与AI幻觉(31页PDF)
PDF深入探讨了AI幻觉的概念、原因、评测方法及其实用应用,特别是在金融领域的具体案例。首先介绍了AI幻觉的定义,主要包括数据偏差、泛化困境、知识固化和意图误解四种情况,以及这些因素导致AI产出不合理结果的原因。随后,通过音乐…...
