C++观察者模式

一、定义

观察者(Observer)模式 定义如下:
是一种对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

二、观察者模式组成:
  • 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。
  • 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。
  • 具体目标角色(Concrete Subject):当它的状态发生改变时, 向它的各个观察者发出通知。可以维护一个指向Concrete Subject 对象的指针,通过这个对象在构造函数注册,在析构函数删除
  • 具体观察者角色(Concrete Observer):实现Observer 的更新接口以使自身状态与目标的状态保持一致。在本角色内也
三、 总结

1.观察者模式 主要解决了什么问题?
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

2.观察者模式 何时使用?
一个对象的状态发生改变,所有的依赖对象都将得到通知,进行广播通知。

3、观察者模式 的优缺点
【优点】

  • 观察者和被观察者是抽象耦合的。
  • 建立一套触发机制。

【缺点】

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
四、 代码示例:
#include <iostream>
#include <vector>
#include <algorithm>// 抽象观察者角色
class Subject;class Observer {
public:virtual ~Observer() {if (subject) {subject->detach(this);}}virtual void update() = 0;protected:Observer(Subject* sub) : subject(sub) {subject->attach(this);}Subject* subject;
};// 抽象目标角色
class Subject {
public:virtual ~Subject() {}void attach(Observer* observer) {observers.push_back(observer);}void detach(Observer* observer) {observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}void notify() {for (Observer* observer : observers) {observer->update();}}private:std::vector<Observer*> observers;
};// 具体目标角色
class ConcreteSubject : public Subject {
public:void setState(int state) {this->state = state;notify();}int getState() const {return state;}private:int state;
};// 具体观察者角色
class ConcreteObserver : public Observer {
public:ConcreteObserver(ConcreteSubject* sub) : Observer(sub), subject(sub) {}void update() override {std::cout << "Observer: Subject's state is " << subject->getState() << std::endl;}private:ConcreteSubject* subject;
};int main() {ConcreteSubject subject;ConcreteObserver observer1(&subject);ConcreteObserver observer2(&subject);subject.setState(1);subject.setState(2);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易优cms远程调试

易优cms自ThinkPHP5.0版本开始&#xff0c;提供了Socket日志驱动用于本地和远程调试。 Socket调试 只需要在配置文件中设置如下&#xff1a; ‘log’ > [ ‘type’ > ‘socket’, ‘host’ > ‘slog.thinkphp.cn’, //日志强制记录到配置的client_id ‘force_c…

无人机捕获的视频跟踪UAV123数据集(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 摘要&a…

TC3xx启动的功能安全机制浅析(2)

目录 1.引入 2. 应用启动阶段 3.小结 1.引入 TC3xx启动的功能安全机制浅析(1)-CSDN博客我们简述了SM基本概念以及芯片启动阶段Safety机制&#xff0c;接下来我们继续描述应用启动阶段相关功能安全机制 2. 应用启动阶段 在用户启动阶段&#xff0c;与功能安全相关的内容…

港股再遭重挫,市场到底在恐慌什么?

恒指上周五挫逾300点后&#xff0c;今日早间延续低迷低开超百点&#xff0c;随后一路震荡下行&#xff0c;最低见17789.57点。整体市场都表现相当低迷&#xff0c;但17750附近有一定支撑。截至收盘&#xff0c;恒指收跌0.00%。 港股持续在万八关徘徊&#xff0c;国资委旗下国新…

时间?空间?复杂度??

1.什么是时间复杂度和空间复杂度&#xff1f; 1.1算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称为空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空…

node.js环境安装以及Vue-CLI脚手架搭建项目教程

目录 ▐ vue-cli 搭建项目的优点 ▐ 安装node.js环境 ▐ 搭建vue脚手架项目 ▐ 项目结构解读 ▐ 常用命令 ▐ 创建组件 ▐ 组件路由 ▐ vue-cli 搭建项目的优点 传统的前端项目架构由多个html文件&#xff0c;且每个html文件都是相互独立的&#xff0c;导入外部组件时需…

【STM32】中断应用概述

前面我们知道在手册中有一个中断向量表&#xff0c;初步了解了中断的概念。 1.NVIC简介 NVIC是嵌套向量中断控制器&#xff0c;控制着整个芯片中断相关的功能&#xff0c;它跟内核紧密耦合&#xff0c;是内核里面的一个外设。 在固件库中&#xff0c;NVIC的结构体定义可谓是…

【第27章】Vue实战篇之用户头像修改

文章目录 前言一、界面搭建二、头像回显三、头像上传1. 自动上传1.1 表单1.2 事件 2. 更新用户头像2.1 调用接口2.2 界面代码2.3 事件代码 总结 前言 这里来完成修改用户头像的功能。 一、界面搭建 <script setup>import { Plus, Upload } from element-plus/icons-vue…

RabbitMQ的高可用机制有了解过嘛

面试官&#xff1a;RabbitMQ的高可用机制有了解过嘛 候选人&#xff1a; 嗯&#xff0c;熟悉的~ 我们当时项目在生产环境下&#xff0c;使用的集群&#xff0c;当时搭建是镜像模式集群&#xff0c;使用了3台机器。 镜像队列结构是一主多从&#xff0c;所有操作都是主节点完成&a…

Listary——最好用的电脑搜索文件软件

简易版&#xff1a; https://www.listary.com/download-completion?versionstable 完整功能版&#xff1a; Microsoft PowerToys | Microsoft Learn

android——解决bug的流程以及细节

目录 心态 一、如何定位到有问题的bug代码 (1)搜索大法 (2)log输出大法 (3)profiler查看大法 (4)万能法找到页面 二、解决棘手bug的步骤 (1)先看再想最后动手 (2)改变现状 (3)是技术问题还是业务问题 (4)张张嘴远胜于动动手 (5)bug解决不了&#xff0c;那就解决提出…

华为仓颉编程语言震撼发布!Hello Cangjie!

引言 2024 年度华为开发者大会&#xff08;HDC&#xff09;在 6 月 21 日拉开帷幕&#xff0c;鸿蒙 NEXT&#xff08;HarmonyOS NEXT&#xff09;操作系统在万众瞩目中横空出世。 华为常务董事、终端 BG 董事长余承东激动地表示 &#xff0c;从 2019 年 8 月 9 日至今共 1778 天…

创新、引领、发展——SAMPE中国2024年会在京盛大开幕

绿树阴浓夏日长&#xff0c;在这个色彩缤纷的季节&#xff0c;SAMPE中国2024年会暨第十九届国际先进复合材料制品原材料、工装及工程应用展览会在中国国际展览中心&#xff08;北京朝阳馆&#xff09;隆重开幕。新老朋友共聚一堂&#xff0c;把酒话桑麻。 为期4天的国际学术会…

【FFmpeg】AVPacket结构体

【FFmpeg】AVPacket结构体 1.AVPacket结构体的定义 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用ffmpeg库进行SDL2解码后渲染 流程分析&#xff1a; 【FFmpeg】编码链…

Cython 是什么

Cython 是一个 Python 编译器&#xff0c;它将 Python 代码编译成 C 代码。这意味着您可以使用 Python 的语法来编写代码&#xff0c;但通过 Cython 编译后&#xff0c;它将以接近 C 语言的速度运行。 特点 静态类型&#xff1a;Cython 提供了静态类型检查&#xff0c;这意味着…

不出网上线CS的各种姿势(内网横向)

情况一&#xff1a;存在一台中转机器 存在一台中转机器&#xff0c;这台机器出网&#xff0c;这种是最常见的情况。 经常是拿下一台边缘机器&#xff0c;其有多块网卡&#xff0c;用于连接内外网&#xff0c;内网机器都不出网。这种情况下拿这个边缘机器做中转&#xff0c;就…

分享几个小红书获取笔记详情API接口调用实例

item_get_video-获得小红书笔记详情 smallredbook.item_get_video 公共参数 名称类型必须描述keyString是调用key&#xff08;API支持测试&#xff0c;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[i…

react 父子组件的渲染机制 优化手段

**优化后** 优化思路&#xff1a;将使用了state的组件拆分为一个子组件&#xff0c;state在子组件中使用(将state下发到子组件)&#xff0c;state变化时仅当前组件重渲染。// 优化后写法 const Component () > { return ( ) } const ButtonWithDialog () > { const […

HTML(14)——结构伪类选择器和伪元素选择器

结构伪类选择器 作用&#xff1a; 根据元素的结构关系查找元素 选择器说明E:first-child查找第一个E元素E:last-child查找最后一个E元素E:nth-child(N)查找第N个E元素(第一个元素N值为1) 例如&#xff1a;查找第一个li标签&#xff0c;将背景改为绿色 <style> li:fir…

【OpenGL基础教程】OpenGL的介绍

文章目录 前言可编程管线(核心模式)状态机总结 前言 在计算机图形学领域&#xff0c;OpenGL&#xff08;Open Graphics Library&#xff09;是一个标准&#xff0c;它定义了一套跨语言、跨平台的编程接口。它用于渲染2D、3D矢量图形。这个接口由近350个不同的函数调用组成&…