观察者模式通过定义一对多依赖关系,使被观察者状态变化时能自动通知所有观察者。在C++中,Subject类维护Observer列表并提供注册、注销和通知方法,Observer接口定义更新操作。示例中TemperatureSensor作为具体被观察者,当温度改变时调用notifyObservers通知所有Display观察者,后者根据新温度更新显示。该模式利用多态和指针管理实现松耦合,适用于GUI事件、消息系统等场景,关键在于明确发布者与订阅者角色,确保接口清晰、数据及时同步。
观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。在C++中实现观察者模式,通常涉及两个核心角色:被观察者(Subject)和观察者(Observer)。
要实现观察者模式,首先需要定义抽象接口:
具体类继承这些接口,并实现相应逻辑。下面是一个简单的C++实现示例。
以下是使用C++实现观察者模式的典型方式:
// Observer 接口
class Observer {
public:
virtual ~Observer() = default;
virtual void update(float temperature) = 0;
};
// Subject 抽象类
class Subject {
private:
std::vector
protected:
void notifyObservers(float temperature) {
for (auto obs : observers) {
obs->update(temperature);
}
}
public:
virtual ~Subject() = default;
void attach(Observer o) {
observers.push_back(o);
}
void detach(Observer o) {
observers.erase(std::remove(observers.begin(), observers.end(), o), observers.end());
}
};
// 具体被观察者:温度传感器
class TemperatureSensor : public Subject {
private:
float temperature;
public:
void setTemperature(float temp) {
temperature = temp;
notifyObservers(temperature);
}
};
// 具体观察者:显示设备
class Display : public Observer {
private:
std::string name;
public:
Display(const std::string& n) : name(n) {}
void update(float temperature) override {
std::cout
}
};
// 使用示例
int main() {
TemperatureSensor sensor;
Display display1("室内屏");
Display display2("室外屏");
sensor.attach(&display1);
sensor.attach(&display2);
sensor.setTemperature(25.5f);
sensor.setTemperature(26.0f);
sensor.detach(&display2);
sensor.setTemperature(27.0f);
return 0;
}
上述实现有几个需要注意的地方:
这种模式适合解耦事件源和响应逻辑,常用于GUI事件处理、消息系统或传感器数据分发等场景。
基本上就这些。只要理清谁是发布者、谁是订阅者,接口定义清晰,C++中的观察者模式并不难实现。
# ai
# c++
# String
# Float
# for
# 多态
# const
# auto
# int
# void
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# class
# public
# private
# protected
# 对象
# 事件
# default
# display
# 传感器
# 谁是
# 的是
# 是一个
# 是一种
# 适用于
# 有几个
# 需要注意
# 关键在于
# 外屏
# 并不难
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何使用Golang匿名函数_快速定义临时函数逻辑
Win11怎么制作U盘启动盘_Win11原版系统安装盘制作【详解】
如何高效获取循环末次生成的 NumPy 数组最后一个元素(无需额外循环)
Python大型项目拆分策略_模块化解析【教程】
如何使用Golang理解结构体指针方法接收者_Golang修改字段实践
如何使用Golang实现Web表单数据绑定_自动映射字段到结构体
Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值
MAC怎么解压RAR格式文件_MAC第三方解压工具安装与压缩包管理【教程】
c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】
php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】
如何在Golang中定义接口_抽象方法和多态实现
Python正则表达式实战_模式匹配说明【教程】
如何使用Golang编写单元测试_创建Test函数验证业务逻辑
短链接怎么用php递归还原_多层加密链接的处理法【详解】
Python对象生命周期管理_创建销毁说明【指导】
如何自定义Windows终端的默认配置文件?(PowerShell/CMD)
用Python构建微服务架构实践_FastAPI与Django对比详解
php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】
Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案
Win11如何设置开机问候语 Win11修改登录界面提示【技巧】
Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键
Python网络日志追踪_请求定位解析【教程】
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
Win11怎样安装钉钉客户端_Win11安装钉钉教程【步骤】
如何在Golang中捕获结构体方法错误_Golang方法返回error处理实践
Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】
Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
Win11怎么退出微软账户_切换Win11为本地账户登录方法【详解】
如何在 Go 中创建包含映射(map)的切片(slice)结构
Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
Win11怎么关闭自动调节亮度_Windows11禁用内容自适应亮度
Windows10系统服务优化指南_Win10禁用不必要服务提升性能
Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】
如何使用Golang实现文件加密_Golang crypto 文件加密示例
windows系统找不到无线网络怎么办_windows WLAN适配器故障排查
ACF 教程:正确更新嵌套在多层 Group 字段内的子字段
Python大文件处理策略_内存优化说明【指导】
php485能和物联网模块通信吗_php485对接NB-IoT模块实例【说明】
如何在Golang中优化文件读写性能_使用缓冲和并发处理
Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】
Python文件管理规范_工程实践说明【指导】
Windows11如何设置专注助手_Windows11专注助手使用攻略【技巧】
Mac怎么安装软件_Mac安装dmg与pkg文件的区别【指南】
c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】
VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】
c++怎么实现大文件的分块读写_c++ 文件指针seekp与seekg偏移控制【方法】
Win11怎么把图标拖到任务栏_Win11固定应用快捷方式指南【方法】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
2025-11-21
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。