c++观察者模式

2023-11-03

观察者模式

1、观察者模式简介

  观察者模式也叫发布-订阅模式、模型-视图模式、源-监听器模式以及从属者模式,观察者模式定义了对象之间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

2、实例讲解

  假如张三、李四、王五三人都订阅了环球日报的报纸。那么当环球日报的报纸有更新的时候就会送到他们三人手中。

//报纸接口类
class NewsPaperBase
{
public:
    //添加订阅者
    virtual void RegisterSubscriber(ISubScribe* f_subScribe) = 0;
    //取消订阅
    virtual void RemoveSubScriber(ISubScribe* f_subScribe) = 0;
    //发送报纸
    virtual void SendPaper() = 0;

    virtual ~NewsPaperBase(){}
};

//订阅者接口类
class SubScribeBase
{
public:
    //有新的报纸了就会被执行通知
    virtual void HasNewPaper() = 0;
	virtual string GetName();
    virtual ~SubScribeBase(){}
	
};

//具体实现是哪种报纸
class GlobalDaily :
    public NewsPaperBase
{
public:
    GlobalDaily();
    virtual ~GlobalDaily();
   //重写基类方法
    void RegisterSubscriber(SubScribeBase* f_subScribe)
	{
		subs.add(f_subScribe);//伪代码
		cout << f_subScribe->GetName().c_str()<<"完成订阅" << endl;
	}
     void RemoveSubScriber(SubScribeBase* f_subScribe)
	 {
		subs.remove(f_subScribe);//伪代码
		cout << f_subScribe->GetName().c_str()<<"取消订阅" << endl;
	 }
    void SendPaper()
	{
		for(auto v:subs)
		{
			v->HasNewPaper();
		}
	}

private:
	//关联订阅者
    vector<SubScribeBase*> subs;
};

//具体的订阅者实现
class SubPeople :
    public SubScribeBase
{
public:
    SubPeople(std::string name):m_name(name){};
    ~SubPeople();
    void HasNewPaper()
	{
		std::cout << m_name << "收到报纸" << endl;
	}
	string GetName()
	{
		return m_name;
	}
private:
    std::string m_name;
};

//调用步骤
int main()
{
    NewsPaperBase* pGlobalPaper = new GlobalDaily();
    SubScribeBase* sub = new SubPeople("张三");
    pGlobalPaper->RegisterSubscriber(sub);
    sub = new SubPeople("李四");
    pGlobalPaper->RegisterSubscriber(sub);
    sub = new SubPeople("王五");
    pGlobalPaper->RegisterSubscriber(sub);
    pGlobalPaper->SendPaper();
    
  	return 0;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++观察者模式 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • codex

    gpt3 和codex这类模型真的理解文本或者代码吗 知乎 1 训练数据 从github上爬下小于1MB的python文件 去除掉那些可能是自动生成的 平均每行长度大于100的 最大行长度大于1000的 几乎不含字母数字的 经过清洗处理后
  • 【cmake学习】find_package 详解

    find package 主要用于查找指定的 package 主要支持两种搜索方法 Config mode 查找 xxx config cmake或 xxxConfig cmake的文件 如OpenCV库的OpenCVConfig cmak
  • Java的单例模式实现方式

    Java的单例模式实现方式 几种常见形式 饿汉式 饿汉式 静态块 懒汉式 线程不安全 懒汉式 线程安全 双重锁校验 静态内部类 枚举单例 容器单例 举出至少4种单列可能被破坏的场景 饿汗式单例的存在线程安全问题 在双重校验锁单例中存在指令重
  • sonar扫描android文件,sonar扫描android项目配置 mac版

    一 下载安装 JDK8以上 SonarQube SonarQube Scanner 1 解压缩SonarQube和SonarQube Scanner 直接运行SonarQube中bin目录下的sonar sh 使用浏览器打开页面 就看到So
  • pcl去除重复点云

    cpp bool compare pt pcl PointXYZI p1 pcl PointXYZI p2 if p1 x p2 x return p1 x gt p2 x else if p1 y p2 y return p1 y gt
  • 【Three.js】第十八章 Particles 粒子

    介绍 粒子 它们非常受欢迎 可用于实现各种效果 如星星 烟 雨 灰尘 火和许多其他东西 粒子的好处是您可以在屏幕上以合理的帧速率显示数十万个粒子 缺点是每个粒子都由一个始终面向相机的平面 两个三角形 组成 创建粒子就像制作网格一样简单 我们
  • 网络爬虫之记一次js逆向解密经历

    1 引言 数月前写过某网站 请原谅我的掩耳盗铃 的爬虫 这两天需要重新采集一次 用的是scrapy redis框架 本以为二次爬取可以轻松完成的 可没想到爬虫启动没几秒 出现了大堆的重试提示 心里顿时就咯噔一下 悠闲时光估计要结束了 仔细分
  • array_unique 去重---php

    php数组去掉重复值的方法 首先创建一个PHP示例文件 然后定义一个数组 最后通过 array unique arr 方法把数组中的元素进行去重即可 1 使用array unique方法进行去重 对数组元素进行去重 我们一般会使用array
  • git 如何拉取项目

    首先 git init 文件夹 使文件夹变成 git 可以操作的 然后注意 本地存放代码的目录下必须是最干净的 没有被git的记录的或者init后目录中有其他文件和git库里不同的就会报错 最后 使用 git pull 拉取 例如 链接是
  • 二分类变量相关性分析spss_SPSS详细教程:Cox回归中,分类变量的PH假定检验

    英国统计学家D R Cox于1972年提出的比例风险回归模型 Proportional hazard regression model 简称Cox回归模型 有效地解决了对于生存资料进行多因素分析的问题 但是Cox回归模型在应用时 有一个非常
  • 1.4亿在线背后-QQ-IM后台架构的演化与启示

    保存于 http pan baidu com s 1bpDZc7d
  • MySQL异常:TIMESTAMP with implicit DEFAULT value is deprecated

    问题 D software mysql mysql 5 7 17 winx64 mysql 5 7 17 winx64 bin gt mysqld initialize 2017 12 13T07 08 35 613357Z 0 Warni
  • 51单片机:TLC549测量电压,并将测量值显示在数码管上

    51单片机 TLC549测量电压 并将测量值显示在数码管上 要求 在51单片机上利用TLC549这个A D转换器测量电压 并将测量值显示在数码管上 电源范围是0 5V 可以实时测量出电压大小并显示出来 仿真电路图 代码如下 TLC549测量
  • 资源分配与调度

    1 资源管理概述 1 1 资源管理的目的和任务 目的 1 保证资源的高利用率 2 在 合理 时间内使所有顾客有获得所需资源的机会 3 对不可共享的资源实施互斥使用 4 防止由资源分配不当而引起的死锁 对资源的管理应包括以下几个方面 1 资源
  • Boost练习程序(program_options)

    include
  • MFC 单文档调用对话框

    1 插入新的Dialog 如下图 2 修改ID位 IDD XMB 3 在单文件的Menu 中选中需要链接的按键 右键添加处理程序 如下图所示 添加完成后 在项目的xxxview cpp中会生成如下函数 4 对新添加的IDD XMB的Dial
  • VS在编译后.obj文件出现错误 error LNK2019: 无法解析的外部符号 的一种可能

    若有包含其他库 且规模较大 在写自己的代码时尽量避免把代码放在如小写 common 这种常见名字的文件夹内 否则容易出现编译成功 但 obj文件找不到某个函数导致错误LNK2019
  • GBase 8a视频配套联系

    1 以下关于粗粒度智能牵引描述正确的是 A 免维护 自动建立 B 每一列数据都会生成一个粗粒度智能牵引 C 牵引的建立和维护对资源的消耗可以忽略不计 D 记录DC内的最大值 最小值 空值 求和值等 答案ACD 2 GBase 8a集群数据库
  • UART和SPI简介

    UART 即通用异步收发器 是一种通用的串行 异步通信总线 该总线有两种数据线 可以实现数据的发送和接收 在嵌入式系统中常用于主机与辅助设备之间的通信 通信基础 并行和串行 并行通信 串行通信 单工通信 双工通信 半双工 发送和接收不可以同
  • c++观察者模式

    观察者模式 1 观察者模式简介 观察者模式也叫发布 订阅模式 模型 视图模式 源 监听器模式以及从属者模式 观察者模式定义了对象之间的一对多依赖关系 使得每当一个对象状态发生改变时 其相关依赖对象皆得到通知并被自动更新 2 实例讲解 假如张