C++设计模式——观察者模式

C++设计模式:观察者模式 C++面试题 阅读详情

观察者模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。

再说说上面的数据和图之间的关系;不管是折线图、饼状图,还是柱状图,它们都依赖于数据;当数据发生变化时,数据对象会通知依赖于它的对象去更新;所以就有了Excel中,当数据发生变化时,对应的统计图也会自动的重绘。

 

UML类图

Subject(目标)
——目标知道它的观察者。可以有任意多个观察者观察同一个目标;
——提供注册和删除观察者对象的接口。

Observer(观察者)
——为那些在目标发生改变时需获得通知的对象定义一个更新接口。

ConcreteSubject(具体目标)
——将有关状态存入各ConcreteObserver对象;
——当它的状态发生改变时,向它的各个观察者发出通知。

ConcreteObserver(具体观察者)
——维护一个指向ConcreteSubject对象的引用;
——存储有关状态,这些状态应与目标的状态保持一致;
——实现Observer的更新接口以使自身状态与目标的状态保持一致。

观察者模式按照以下方式进行协作:

  1. 当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致的改变时,它将通知它的各个观察者;
  2. 在得到一个具体目标的改变通知后,ConcreteObserver对象可向目标对象查询信息。ConcreteObserver使用这些信息以使它的状态与目标对象的状态一致。

以下是调用时序图:

 

使用场合

在以下任一情况下都可以使用观察者模式:

  1. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;
  2. 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;
  3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁;也就是说,你不希望这些对象是紧密耦合的。

 

代码实现

#include <iostream>
#include <list>
using namespace std;

class Observer
{
public:
     virtual void Update(int) = 0;
};

class Subject
{
public:
     virtual void Attach(Observer *) = 0;
     virtual void Detach(Observer *) = 0;
     virtual void Notify() = 0;
};

class ConcreteObserver : public Observer
{
public:
     ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}

     void Update(int value)
     {
          cout<<"ConcreteObserver get the update. New State:"<<value<<endl;
     }

private:
     Subject *m_pSubject;
};

class ConcreteObserver2 : public Observer
{
public:
     ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}

     void Update(int value)
     {
          cout<<"ConcreteObserver2 get the update. New State:"<<value<<endl;
     }

private:
     Subject *m_pSubject;
};

class ConcreteSubject : public Subject
{
public:
     void Attach(Observer *pObserver);
     void Detach(Observer *pObserver);
     void Notify();

     void SetState(int state)
     {
          m_iState = state;
     }

private:
     std::list<Observer *> m_ObserverList;
     int m_iState;
};

void ConcreteSubject::Attach(Observer *pObserver)
{
     m_ObserverList.push_back(pObserver);
}

void ConcreteSubject::Detach(Observer *pObserver)
{
     m_ObserverList.remove(pObserver);
}

void ConcreteSubject::Notify()
{
     std::list<Observer *>::iterator it = m_ObserverList.begin();
     while (it != m_ObserverList.end())
     {
          (*it)->Update(m_iState);
          ++it;
     }
}

int main()
{
     // Create Subject
     ConcreteSubject *pSubject = new ConcreteSubject();

     // Create Observer
     Observer *pObserver = new ConcreteObserver(pSubject);
     Observer *pObserver2 = new ConcreteObserver2(pSubject);

     // Change the state
     pSubject->SetState(2);

     // Register the observer
     pSubject->Attach(pObserver);
     pSubject->Attach(pObserver2);

     pSubject->Notify();

     // Unregister the observer
     pSubject->Detach(pObserver);

     pSubject->SetState(3);
     pSubject->Notify();

     delete pObserver;
     delete pObserver2;
     delete pSubject;
}

总结

观察者模式在23个设计模式中的地位是非常高的,我们基本上各大框架中都是随处可见。真正的理解了整个模式,对我们去理解别人的代码有非常大的帮助;在我们日后的工作中也会或多或少的使用该设计模式。这里总结的不是很全面,在日后如果碰到了需要补充的内容,我会继续补充的;同时也希望大家提出更好的建议。

【Python计量】linearmodels面板数据回归(一) 我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。 阅读详情

相关推荐

RV1126平台librga图像旋转裁剪实战

本文详细介绍了在rv1126平台上使用librga库实现图像旋转和裁剪的方法。首先解释了librga的基本概念和关键对象,包括源图像、目标图像和操作参数。随后分步骤说明了初始化设置、缓冲区创建、裁剪区域定义(通过坐标和尺寸参数)以及旋转操作(支持常见角度)。提供了完整的示例代码演示如何组合裁剪和旋转操作,并强调了性能优化、错误处理、格式支持等注意事项。通过硬件加速的librga,可以在rv1126平台上高效完成图像处理任务。

hwmxrhx的博客 1543

C++设计模式(5)——观察者模式

C++ 观察者模式

伍粟的博客 4025

服务器测试之GPU基础汇总

GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。可以形象的理解为90%的ALU(运算单元),5%的Control(控制单元)、5%的Cache(缓存单元)GPU的设计原理——总结为大量的简单运算。

qq_41897488的博客 2万+

【C++】—— 观察者模式

观察者模式详解

m0_56069910的博客 2648

手把手教你配置微信商户平台IP白名单:企业付款到零钱必备步骤

本文详细解析了微信商户平台IP白名单的配置原理与实操步骤,这是实现企业付款到零钱功能的关键安全环节。文章从理解IP白名单的安全逻辑出发,指导开发者精准定位服务器公网IP,并提供了在商户平台后台的详细配置流程与常见问题排查指南,帮助开发者高效完成配置,确保企业付款API的顺利调用。

weixin_29326909的博客 733

Unity 2022打包Android APK:手把手教你创建和配置第一个签名Keystore(避坑指南)

本文详细介绍了Unity 2022打包Android APK时创建和配置签名Keystore的全流程,包括环境准备、Keystore创建、高级配置避坑指南以及签名验证与故障排查。特别强调了Android应用签名的重要性及安全维护策略,帮助开发者避免常见错误,确保应用顺利发布。

weixin_27379781的博客 241

C++设计模式——观察者模式(Observer Pattern)

C++设计模式——观察者模式(Observer Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——观察者模式(Observer Pattern)目录前言定义代码示例总结观察者模式和中介模式优缺点适用场景及应用示例参考资料 前言 观察者模式面向的需求是:A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者、小偷是被观察者,警察需要时刻盯着小偷的一

leonardohaig的博客 1万+

4.6 知识库使用指南:如何让AI Agent拥有专业知识

本文介绍了如何为AI Agent构建和使用知识库。知识库的作用是为Agent提供专业知识,包含文档、数据和规则,可用于专业问答和知识检索。使用方法包括创建知识库(上传文档)、向量化处理、知识检索以及在Agent中的应用。核心要点是理解知识库的价值和使用流程。文章还提出了构建方法、检索优化和应用实践等思考题,建议准备高质量数据、优化检索效果并持续更新知识库。下节将介绍用LangGraph构建复杂AI应用。

yonggeit的博客 3008

C++设计模式 - 观察者Observer模式

C++面向对象设计模式之观察者模式

大秦坑王的专栏 4995

【大模型+知识图谱】哈工大版chinese-roberta-wwm-ext模型介绍、下载部署和GPU显卡配置

RoBERTa模型的一个重要改进版本,由阿里云的研究团队提出。而Chinese RoBERTa-wwm-ext则是针对中文文本的预训练模型,它在哈工大的研究团队手中进一步优化,特别适用于中文自然语言处理任务。

知识靠谱的博客 2772

ESP32-C3蓝牙透传通信的BLE协议栈工程实践

蓝牙低功耗(BLE)透传是一种基于GATT服务模型的数据透明传输机制,其核心原理在于Peripheral设备通过广播建立连接,并在GATT Server层暴露可读写特征值实现双向数据通道。该技术具备低功耗、跨平台兼容性强、开发门槛适中等优势,广泛应用于智能硬件、工业传感器与嵌入式网关等场景。在实际工程中,透传稳定性高度依赖BLE协议栈的分层协同——Link Layer负责可靠连接建立,GATT Server则定义数据交互语义;而ESP32-C3的AT指令集正是对这两层能力的封装调度。本文聚焦BLE透传的关键

weixin_29859471的博客 121

C++设计模式-观察者模式

目录 基本概念 代码与实例 基本概念 观察者模式又叫做发布-订阅模式; 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动的更新自己。 对应的UML如下(此图来源于 大话设计模式): 代码与实例 下面给出C++的实例,程序运行截图如下: 本人目前水平对这个...

IT1995的博客 8482

零基础入门simulink1000例--第112例:在 Simulink 中构建一个基本的相控阵雷达波束形成系统仿真模型

摘要:本文详细介绍了使用Simulink实现相控阵雷达波束形成技术的完整流程。从创建Simulink模型、设计天线阵列、信号生成,到波束形成算法实现和结果可视化,涵盖了关键步骤。文章重点讲解了均匀线性阵列的设计、线性调频信号生成、相位偏移计算等核心技术,并提供了MATLAB代码示例。通过Scope或ArrayPlot模块进行结果分析,最终可导出为嵌入式代码部署。该系统展现了电子扫描波束的技术优势,为雷达系统设计提供了有效的仿真方法。

amy_mhd的博客 209

C++设计模式——观察者模式(observer pattern)

一、原理讲解 1.1意图 定义一种“一对多”的关系。当一个对象(被观察者/发布者)的状态发生改变时,所有依赖它的对象都将得到通知并更新。又有别名为发布-订阅(publish-subscribe)。 1.2应用场景 一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中,以使它们可以独立的改变和复用 当一个对象改变,连带其它对象也跟着改变,但是不需要知道具体改变对象...

净无邪博客 1141

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式之观察者模式(Observer Pattern),C++篇

观察者模式是一种行为设计模式,用于对象间一对多的依赖关系。当被观察对象状态改变时,会自动通知所有依赖的观察者。该模式包含四个核心角色:主题(Subject)、观察者(Observer)、具体主题(Concrete Subject)和具体观察者(Concrete Observer)。适用场景包括事件处理系统、消息传递等需要松耦合通知机制的场合。代码示例展示了C++实现,通过主题维护观察者列表,在状态变化时循环通知所有观察者进行更新。该模式有效降低了对象间的耦合度,适用于状态变化引发连锁反应的系统设计。

guoguojiang_的博客 1003

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++设计模式之观察者模式(Observer pattern)

观察者模式: 为对象建立一种“通知依赖”关系,当一个对象(目标对象)的状态发生变化时,所有的依赖对象(观察者对象)都得到通知并自动更新。 观察者模式,又称发布-订阅模式,其所作的工作就是在解除耦合,弱化依赖关系,采用面向对象技术,让耦合的双方都依赖于抽象,而不是依赖于具体,将这二者封装在独立的对象中以使它们可以独立的改变和复用。 观察者模式中的四类角色: 1.Subject(目标):抽象的目标类,提供增加和删除观察者对象的的方法,以及一个抽象的Notify方法(通知机制),目标类可以是接口,也可以是抽象类和

weixin_43086349的博客 266

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《Head First 设计模式》C++实现【观察者模式(Observer Pattern)】

《Head First 设计模式》书中第2章——观察者模式(Observer Pattern)的C++代码实现。

Liber-coder的博客 306

【设计模式】设计模式C++编程实现之观察者模式(ObserverPattern)

观察者模式定义: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听

计算机专业同学的充电站。 2918

C++_设计模式_观察者模式(Observer Pattern)

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。“观察”不是“直接调用”,实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。不管是观察者“观察”对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

bliu2_10的博客 966

c++ 设计模式_设计模式行为型:观察者模式(ObserverPattern)

定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。结构图角色与理解观察者模式共分为四种角色: Subject(目标类):被观察的对象,内部定义一个观察者集合,并...

weixin_39974223的博客 110

【c++设计模式21】行为模式6:观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式,它建立了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并更新。

junxuezheng的博客 1072

C++ 设计模式——观察者模式

观察者模式(Observer Pattern)是一种常用的设计模式,属于行为型模式。它定义了一种一对多的依赖关系,使得当一个对象(主题)状态发生变化时,所有依赖于它的对象(观察者)都会得到通知并自动更新。

慢慢记录,慢慢更新。 3143

OpenCore Legacy Patcher 根卷补丁实战:macOS 更新后如何重新打补丁与回退

用 OpenCore Legacy Patcher(OCLP,一个让老 Mac 运行 Big Sur 至 Sequoia 的开源补丁工具)装好系统之后,很多人会在一次 macOS 系统更新后发现问题:桌面图标闪烁、Metal 图形加速消失、Wi-Fi 时好时坏,而补丁器状态页显示根补丁已失效。原因并不神秘——系统更新会用 APFS 密封快照封存一个全新的系统卷,旧快照里的 KernelCollec

gitblog_07855的博客 451

c++设计模式:观察者模式(Observer Pattern)

定义: 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 场景: 我们有一个气象站,我们通过WeatherData获取气象站的最新数据,并更新布告板上的数据。我们定义了两个布告板,一个是温度计,显示最新的温度,另一个布告板就是显示当前的所有温度、湿度和气压的最新数据。 类图: c++代码如下:

编程小生的专栏 682

C++ 设计模式 十九:观察者模式 (读书 现代c++设计模式)

何时需要使用观察者模式?观察者模式的核心应用场景是实现对象间的一对多依赖关系,当被观察对象(Subject)的状态变化需要自动通知多个依赖对象(Observer)时使用。事件驱动系统GUI框架中按钮点击事件、数据模型变化触发视图更新。示例:用户点击按钮后,通知多个UI组件刷新状态。实时数据分发传感器数据更新时,通知多个监控模块(如温度传感器→显示屏、报警器)。发布-订阅机制消息队列中生产者发布消息,多个消费者订阅并处理消息。示例:新闻推送系统,用户订阅主题后接收相关新闻。

Duramentee的博客 2037
上一篇: C++设计模式——备忘录模式
下一篇: C++设计模式——状态模式
CoderAldrich
博客等级 码龄12年 431粉丝 24原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值