C++ 设计模式:观察者模式(Observer Pattern)
链接:C++ 设计模式
链接:C++ 设计模式 - 模板方法
链接:C++ 设计模式 - 策略模式
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,它会通知所有观察者对象,使它们能够自动更新。
1.问题分析
在开发中,经常会遇到需要在一个对象状态变化时通知其他对象的情况。如果将通知逻辑直接嵌入到主题对象中,会导致代码耦合度高,难以维护和扩展。观察者模式通过将观察者对象和主题对象解耦,使得它们可以独立变化。
2.实现步骤
- 定义观察者接口:定义一个接口,包含更新方法。
- 定义主题接口:定义一个接口,包含注册、注销和通知观察者的方法。
- 实现具体主题类:具体主题类实现主题接口,并维护一个观察者列表。
- 实现具体观察者类:具体观察者类实现观察者接口,并在更新方法中实现具体的响应逻辑。
3.代码示例
以机器人电池电量作为示例:
3.1.观察者接口
// 定义更新方法
class Observer {public:virtual ~Observer() = default;virtual void update(int batteryLevel) = 0;
};
3.2. 主题接口
// 定义添加、删除和通知观察者的方法
class Subject {public:virtual ~Subject() = default;virtual void addObserver(std::shared_ptr<Observer> observer) = 0;virtual void removeObserver(std::shared_ptr<Observer> observer) = 0;virtual void notifyObservers() = 0;
};
3.3.具体主题类
// 实现主题接口
class Robot : public Subject {public:void addObserver(std::shared_ptr<Observer> observer) override { observers.push_back(observer); }void removeObserver(std::shared_ptr<Observer> observer) override {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notifyObservers() override {for (const auto& observer : observers) {observer->update(batteryLevel);}}void setBatteryLevel(int level) {batteryLevel = level;notifyObservers();}private:std::vector<std::shared_ptr<Observer>> observers;int batteryLevel = 100;
};
3.4.具体观察者类
// 具体观察者类1,显示电池电量
class BatteryDisplay : public Observer {public:void update(int batteryLevel) override { std::cout << "BatteryDisplay: Battery level is " << batteryLevel << "%" << std::endl; }
};
// 具体观察者类2,当电池电量低于20%时发出警告
class BatteryWarning : public Observer {public:void update(int batteryLevel) override {if (batteryLevel < 20) {std::cout << "BatteryWarning: Warning - Battery level low (" << batteryLevel << "%)" << std::endl;}}
};
3.5.调用算法
int main() {auto robot = std::make_shared<Robot>();auto batteryDisplay = std::make_shared<BatteryDisplay>();auto batteryWarning = std::make_shared<BatteryWarning>();robot->addObserver(batteryDisplay);robot->addObserver(batteryWarning);std::cout << "Setting battery level to 50%" << std::endl;robot->setBatteryLevel(50);std::cout << "\nSetting battery level to 15%" << std::endl;robot->setBatteryLevel(15);return 0;
}
相关文章:
C++ 设计模式:观察者模式(Observer Pattern)
链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 策略模式 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主…...
栈及栈的操作
栈及栈的操作 栈结构 栈是一种只能在一端进行插入或删除操作的数据结构。栈有两个基本的操作:入栈和出栈。 入栈:将一个新的元素放到栈顶。 出栈:从栈顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的操作规则:LIFO(Last…...
算法:切饼
对以下题目设计一个算法:切饼 假设:有一张很大很大的饼,给你一把足够长的刀。要求:每次在饼上切一刀。 问题:n刀,最多能切出多少块饼? n3 要解决这个问题,我们可以从数学归纳法的…...
C++ 设计模式:代理模式(Proxy Pattern)
链接:C 设计模式 链接:C 设计模式 - 门面模式 链接:C 设计模式 - 中介者 链接:C 设计模式 - 适配器 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制(…...
JDK、JRE、JVM的区别
JDK(Java Development Kit)、JRE(Java Runtime Environment)和 JVM(Java Virtual Machine)是 Java 开发和运行环境的三个重要组成部分。 JDK 是 Java 开发工具包,它包含了编译器(ja…...
2021年福建公务员考试申论试题(县级卷)
2021年福建公务员考试申论试题(县级卷) 材料一 “把她的家粉刷一新。给独自生活的她更多支持。” 某公益平台上,为女孩小珊修缮房屋的公益计划得到不少爱心网友的支持。1元、10元、100元……不到一个月,爱心捐赠就超过了修缮…...
问题记录:[FATAL] [1735822984.951119148]: Group ‘manipulator‘ was not found.
前言:最近仿照UR5手眼标定的例程,在新的机械臂上进行手眼标定,还准备用easy_hand手眼标定包。将机器人功能包导入到工作空间后进行编译运行,启动launch文件: roslaunch easy_handeye eye_to_hand_CR7_calibration.lau…...
【大模型实战篇】Mac本地部署RAGFlow的踩坑史
1. 题外话 最近一篇文章还是在11月30日写的,好长时间没有打卡了。最近工作上的事情特别多,主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed,后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…...
iOS 修改图片颜色
需求中会遇到这种情况,就是我们需要的图片是已经有的 但是图片的颜色不符合我们的需求,但是又不想再切新的图片了,这个时候,我们可以使用代码的方式修改图片的颜色,达到同样的效果 关键代码就是 [image imageWithRend…...
OceanBase到MySQL实时同步方案
概述 本方案基于OceanBase Binlog服务,采用数据库实时复制软件Beedup订阅捕获OceanBase数据库的Binlog事件,复制软件将Binlog事件还原为MySQL支持的DML或DDL,然后交由MySQL数据库执行。 配置Binlog任务 启用OceanBase Binlog服务ÿ…...
信息系统项目管理师——第8章章 项目整合管理 笔记
8 项目整合管理(最后反过来看) 项目整合过程:①制定项目章程(启动过程)、②制订项目管理计划(规划过程)、③指导和管理项目工作、管理项目知识(执行过程)、④监控项目工…...
最好用的图文识别OCR -- PaddleOCR(1) 快速集成
最近在项目中遇到了 OCR 的需求,希望能够实现高效而准确的文字识别。由于预算限制,我并未选择商业付费方案,而是优先尝试了开源工具。一开始,我测试了 GOT-OCR2.0,但由于我的 Mac 配置较低,不支持 GPU 运算…...
Unity制作3D场景的脑电运动想象范式(左右手抓握)
使用Unity制作3D场景中的运动想象范式 3D技术可以创建出立体的图像和环境,给用户带来更加真实和沉浸式的体验,本文介绍了一种可控的左右手运动的3D场景范式的设计流程,用于被试在3D场景下完成运动想象脑电信号数据的采集。 目录 1.制作动画…...
python23-常用的第三方库01:request模块-爬虫
requests 模块是 Python 中的一个第三方库,用于发送 HTTP 请求。 它提供了一个简单且直观的 API,使得发送网络请求和解析响应变得非常容易。requests 模块支持各种 HTTP 方法,如 GET、POST、PUT、DELETE 等,并且具有处理 cookies…...
CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读
24年5月的论文,上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法,实现…...
持续学习入门
参考视频(一) 【学无止境:深度连续学习】 背景 更新新的数据时,数据异步输入,会有灾难性遗忘 现有解决策略 (1)引入正则约束(2)设计合适的动态模型架构 ÿ…...
天猫推荐数据集实践
参考自 https://github.com/xufengtt/recom_teach_code,学习记录。 环境配置(maxcomputedataworks) 下载天猫推荐数据集;开启 aliyun 的 maxcompute,dataworks,pai;使用 odpscmd 上传本地数据…...
《Vue3实战教程》33:Vue3路由
如果您有疑问,请观看视频教程《Vue3实战教程》 路由 客户端 vs. 服务端路由 服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果。当我们在一个传统的服务端渲染的 web 应用中点击一个链接时,浏览器会从服务端获得全新的 HTML&…...
【大模型系列】MultiUI(2024.11)
Paper:https://arxiv.org/pdf/2410.13824Github:https://neulab.github.io/MultiUI/Author:Junpeng Liu et al., 卡内基梅隆 核心1: 先基于text-based LLMs获取网页的accessibility tree(辅助功能树,https://200t.w3c…...
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。 关键词 条件筛选动态数据展示状态管理UI交互查询系统 一、功能说明 模拟火车票查询系统包含以下功…...
告别变砖!手把手教你为HC32F460打造带断电保护的BootLoader(附完整代码)
工业级HC32F460 BootLoader设计实战:从防变砖到量产级解决方案 当你的嵌入式设备因为固件升级中断而变成"砖头",那种绝望感每个开发者都懂。今天我们要解决的,正是这个让无数工程师夜不能寐的痛点——如何为HC32F460设计一个真正工…...
编译原理不再难:借助快马AI生成交互式示例,轻松入门语法分析
编译原理不再难:借助快马AI生成交互式示例,轻松入门语法分析 刚开始学习编译原理时,最让我头疼的就是语法分析这部分。那些抽象的文法规则、递归下降、LL(1)分析等概念,光看理论总觉得云里雾里。直到我尝试用InsCode(快马)平台做…...
Win11Debloat完整指南:如何一键清理Windows系统,提升51%性能的免费神器
Win11Debloat完整指南:如何一键清理Windows系统,提升51%性能的免费神器 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other …...
开源硬件监控新选择:LibreHardwareMonitor全方位解析与应用指南
开源硬件监控新选择:LibreHardwareMonitor全方位解析与应用指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项…...
G-Helper终极指南:华硕笔记本轻量级性能控制工具完全解析
G-Helper终极指南:华硕笔记本轻量级性能控制工具完全解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...
openclaw里面如何添加channel
在 OpenClaw 中添加 Channel(消息通道 / 渠道),核心是通过 CLI 命令 或直接编辑 配置文件,将 Telegram、Discord、飞书、WhatsApp 等 IM 平台接入网关(Gateway),并绑定到 Agent。以下是完整、可…...
像素皇城·灵蛇贺岁效果展示:红白机美学融合皇城大门的AI春联生成作品
像素皇城灵蛇贺岁效果展示:红白机美学融合皇城大门的AI春联生成作品 1. 项目概览 Pixel Couplet Gen是一款基于ModelScope大模型开发的创新型春联生成工具。与传统春联设计不同,我们大胆采用了8-bit像素游戏风格,将经典红白机视觉元素与中国…...
滑动窗口-438. 找到字符串中所有字母异位词
文章目录1.题解核心解题思路(滑动窗口)2.机考代码3.知识点讲解1. map.getOrDefault(key, defaultValue)2. map.put(key, value)3. map.containsKey(key)4. s.toCharArray()5. s.charAt(index)6. Scanner 相关(机考必备)力扣地址&a…...
EcomGPT-7B模型文件结构与代码解读:从Hugging Face到生产部署
EcomGPT-7B模型文件结构与代码解读:从Hugging Face到生产部署 如果你已经玩过一些开箱即用的AI模型,可能会好奇,一个像EcomGPT-7B这样的模型,它到底是由哪些文件组成的?那些配置文件里密密麻麻的参数都是什么意思&…...
黑丝空姐-造相Z-Turbo场景应用:为你的内容创作提供无限灵感
黑丝空姐-造相Z-Turbo场景应用:为你的内容创作提供无限灵感 1. 镜像概述与核心能力 黑丝空姐-造相Z-Turbo是一款基于Xinference部署的文生图模型服务,通过gradio提供直观的交互界面。该镜像专注于生成特定风格的视觉内容,为创意工作者提供高…...
