C++11观察者模式示例

C++ 11 智能指针 std::weak_ptr 类型是否拥有所有权是否增加引用计数是否可为空是否线程安全shared_ptr✅ 是✅ 是❌ 否✅ 是weak_ptr❌ 否❌ 否✅ 是✅ 是(调用 lock)是 C++ 智能指针体系中不可或缺的一部分。安全访问由shared_ptr管理的对象避免循环引用造成的内存泄漏实现高效的观察者模式、缓存系统等高级功能但同时也要注意它的使用限制和潜在陷阱,尤其是在多线程环境下的并发访问问题。 阅读详情

该示例代码采用C11标准,解决以下问题:

  1. 消除了类继承的强耦合方式;
  2. 通知接口使用可变参数模板,支持任意参数;

示例代码

.h文件如下:

#include <functional>
#include <string>
#include <map>

class NonCopyable
{
protected:
	NonCopyable() = default;
	~NonCopyable() = default;
	NonCopyable(const NonCopyable&) = delete;
	NonCopyable& operator=(const NonCopyable&) = delete;
};

template<typename Func>
class Events : NonCopyable
{
public:
	Events()
	{

	}
	~Events(){}

	int Connect(Func&& f)
	{
		return Assgin(f);
	}

	int Connect(const Func& f)
	{
		return Assgin(f);
	}

	void DisConnect(int key)
	{
		m_connections.erase(key);
	}

	template<typename... Args>
	void Notify(Args&&... args)
	{
		for (auto& it:m_connections)
		{
			it.second(std::forward<Args>(args)...);
		}
	}

private:
	template<typename F>
	int Assgin(F&& f)
	{
		int k = m_observerId++;
		m_connections.emplace(k,std::forward<F>(f));
		return k;
	}
	int m_observerId = 0;
	std::map<int, Func> m_connections;
};

.cpp文件如下:

#include <iostream>
#include "C++11_Observer.h"

using namespace std;
struct stA
{
    int a, b;
    void print(int a, int b)
    {
        cout << a << " , " << b << endl;
    }
};

void print(int a, int b)
{
    cout << a << " , , " << b << endl;
}

int main()
{
    Events<std::function<void(int, int)>> myevent;

    auto key = myevent.Connect(print);
    stA t;
    auto lamadakey = myevent.Connect([&t](int a, int b) {t.a = a; t.b = b; });

    std::function<void(int, int)> f = std::bind(&stA::print,&t,std::placeholders::_1,std::placeholders::_2);

    myevent.Connect(f);
    int a = 1, b = 2;
    myevent.Notify(a,b);

    myevent.DisConnect(key);
    system("pause");
    return 0;
}

输出结果如下:
在这里插入图片描述

C++实现观察者模式 在工程中做代码的时候,经常会需要用到某个状态发生变化,要通知到需要了解该变化的类,Windows编程中经常用到的是发消息,要是没有Windows的消息机制的话,自己做一套消息机制倒是可以,但也是徒增了工作量,再次想到了设计模式中的观察者模式,也可以实现这个想法,具体实现如下:   1、编写观察者和被观察者类,对该类做如下说明如下:   1.1、观察者类,需要从Observer类继承,并且重写虚函数update()   1.2、被观察者类,需要继承Observable类,并且调用addObserver()函数,添加观察者类的对象   代码如下: #ifndef__OBSERVER_H 立即下载

相关推荐

电磁兼容标准体系解析:从基础到认证的完整指南

本文系统解析了电磁兼容(EMC)标准体系,从基础概念到认证流程提供完整指南。文章阐述了EMC对于产品可靠性与市场准入的重要性,详细拆解了基础标准、通用标准、产品类标准及认证流程四层结构,并结合5G设备与工业控制等实战案例,为工程师提供了从设计初期到认证测试的高效应用策略。

weixin_29294975的博客 355

设计者模式(1)观察者模式 (Observer)C++11实现

观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。该模式属于行为型模式。

m0_61705102的博客 1362

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

C++11:参照Java Observable实现观察者模式

Java中的观察者设计模式是个比较实用的设计模式,可以用于数据自动更新,但是C++中并没提供现成的类实现,于是我参照Java的 java.util.Observable,将java代码翻译为C++代码。自己实现了一个observable::observable,用法与Java的Observable类一样。 《JAVA设计模式之观察者模式》 https://www.cnblogs.com/porotin/p/7825656.html 实现代码 整个代码只有一个文件observable.hpp,java源码

10km的专栏 397

制造业批次管理中双计量单位动态转换的实践指南

本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。

weixin_29228203的博客 158

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5337

C++11实现观察者模式

这种实现方式限制太多,最主要的两个限定是:第一,需要继承,继承是强对象关系,不够灵活,第二,观察者模式被通知的接口参数不支持变化,导致观察者不能应付接口的变化。 c++11实现的观察者模式,内部维护了一个泛型函数列表,观察者只需要将观察者函数注册进去即可,通知接口使用了可变参数模板,支持任意参数,消除了接口变化的影响...

guicaifjz的博客 717

Python OpenCV基于颜色通道分离法去除图片中的红色印章

最近一段时间的工作都是研究如何去除图片中的红色印章,在网上查找了大量的大佬写过的方法,发现大多数是采取颜色通道分离法来做,并且效果还不错。站在前人的肩膀上,我又做了些许调整,谈不上是改进,但是能应对更对的情况总还是好的,特此记录。 拿发票做例子,印章相较于其它部分最大的不同就是印章是红色的,而其它部分不是(这是一句废话)。 那么第一步当然就是将红色分离出来,这一步可以采用Python第三方库OpenCV里的 cv2.split()方法,该方法是把RGB图像的三个通道拆分开来,得...

wl_Honest的博客 1万+

C++ 11标准简单实现观察者模式

观察者模式简单理解:被观察者的状态发生变化,观察者的行为同时也发生变化。 观察者模式的简单应用:           1.声明被观察者对象。           2.观察者向被观察者注册消息相应函数。           3.观察者属性发生变化,同时注册上的观察者出发响应。   上面就是我对观察者的简单的理解,但是实际上并不只是如此。 目前有很多开源库都实现了这样的模式。譬如Qt中的c...

qq_15024587的博客 1200

数仓 - 促销敏感度、评论敏感度

1. 促销敏感度 步骤1. 首先按照最后一次下单时间及有无复购情况将用户分为四大群体: 近一年有购物行为且复购的用户 -- L1 (今年复购用户) 近一年有购物行为但无复购的用户 --L2 (今年一单购用户) 最后一次下单时间在1年之前且有复购的用户 --L3 (今年无购且只有一单用户) 最后一次下单时间在1年之前但无复购的用户 -- L4 (今年无购多单用户) 步骤2. 每一类用户群再根据优惠订单占比、每单优惠金额占比的平均值、优惠金额这三个指标进行k-means聚类,分为: 非常敏感 -

weixin_41332009的博客 1898

SpringBoot使用mybatis-plus的自动代码生成器

一.SpringBoot使用mybatis-plus+自动代码生成 使用mybatis-plus可以自动帮我们生成通用的 controller,service,dao,mapper 二.加入依赖 <!-- MP 核心库 --> <dependency> <groupId>com.baomidou</groupId> <artif...

农民娃儿的博客 2263

设计模式——观察者模式(C++11实现)

观察者模式定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 C++11实现的观察者模式,内部维护了一个泛型函数列表,观察者只需要将观察者函数注册进来即可,消除了继承导致的强耦合,通知接口使用了可变参数模板,支持任意参数,消除了接口变化的影响。 #include <iostream> #include <string> #include <functional> #include <map> us

Skynet的博客 757

STM32与HT7038的高精度电能计量系统设计与实现

本文详细介绍了基于STM32微控制器与HT7038三相电能计量芯片的高精度电能计量系统设计与实现。文章从项目选型出发,深入剖析了硬件电路设计、SPI驱动开发、芯片校准及系统集成等关键环节,为智能电表、能源监控等应用提供了高性价比且稳定的国产化解决方案。

pytorch8learner的博客 389

C++行为型模式-实现观察者模式

一、观察者模式基本概念 二、改进观察者模式 参考文献: 【1】

灰太狼的小秘密 7159

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

如何用C++11实现观察者模式

当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在上面的例子中,我们使用了C++11的一些特性,如auto关键字推断类型、unique_ptr智能指针和范围for循环。这样可以使代码更加简洁、安全和易于维护。现在,我们可以创建一个主题对象,并注册多个观察者对象。当主题对象的状态发生改变时,它会通知所有的观察者对象。首先,我们需要创建一个观察者接口,其中包含一个更新方法。这个接口可以被多个观察者类实现,从而实现多态。接下来,我们可以创建一个具体的观察者类,它实现观察者接口,并注册到主题对象中。

大牛直播SDK 929

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ 类之间的互相调用

这几天做C++11的线程池时遇到了一个问题,就是类A想要调用类B的方法,而类B也想调用类A的方法 这里为了简化起见,我用更容易理解的观察者模式向大家展开陈述 观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知,并自动更新 观察者模式中有一个subject和observer observer向subject注册成为一个观察者 当sub...

weixin_30663471的博客 539

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++11之用std::function和std::bind实现观察者模式

使用C++11中的std::bind和std::function以及模板可以很好的实现观察者模式,现在把自己的一些实现的想法记录在此. 编译环境:VS2017 实现的想法:将各个类之间进行解耦,使用C++11的特性实现观察者,C++11中的std::function中可以传函数和lambda仿函数,感觉类似标准之前的回调函数,有时间会去剖析一下该特性. 观察者模式简介: 主体类中...

Jeneboss422460的博客 660

观察者模式:pybind11事件回调系统实现

在现代软件开发中,C++负责高性能计算核心,Python则承担灵活的脚本控制角色。当C++核心模块需要向Python层发送事件通知时,传统方法往往面临巨大挑战: - **类型转换复杂**:C++对象到Python对象的序列化困难 - **性能瓶颈**:频繁的跨语言调用导致性能下降 - **内存管理**:双向引用导致的内存泄漏风险 - **线程安全**:GIL(Global Interpreter...

gitblog_00473的博客 1105

【HF设计模式】02-观察者模式

《Head First设计模式》第2章笔记:结合示例应用和代码,介绍观察者模式,包括遇到的问题、应用的 OO 原则、达到的效果。

三人行,必有我师,其余为同学。老师好,同学好。 1097

C++11的消息总线

一、什么是消息总线 在大规模的软件开发过程中,对象很多,关联关系非常复杂,如果没有统一的、简洁的方法去管理这些对象关系,会导致对象关系复杂,后期维护困难。 基于消息总线技术可以解决这些问题。对象之间只通过消息联系,不是通过直接的依赖或者关联。在消息总线中,对象是通过消息来联系,消息即是对象的关系,只需要在消息总线中管理这些消息,不用关心具体哪些对象之间有关联,便于统一管理。 二、消息总线包含的内容 通用的消息定义 定义一种通用的消息格式,让所有的对象都能接受。 通用的消息类型完整的定义是主题+泛

sinat_31608641的博客 3556

C++11 不使用继承实现观察者模式的方法 注册模板参数

传统的观察者模式的类过于臃肿,存在不好追踪,不方便传参数的因素,在学习了一些书本上的知识后,写了写改进的观察者模式,使用C++中的模板类函数代替。

智能网联汽车V2X开发网的博客 435

C++ 11可变参数接口设计在模板编程中应用的一点点总结

概述   本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化。   如何理解“类定义的弱化”?   一个完整的类有如下几部分组成: 类的名称; 类的成员变量(或属性,C#中属性和成员变量还是有区别的); 类的成员方法;   从编译器的角度看,我们必须明确指定以上3部分,才算完整地定义了一个类并且编译通过。   所谓的“...

weixin_30654583的博客 224

c++实现设计模式中的观察者模式,削除代码的if else switch

该文章有以下几个学习点: 1、单例模式: 创建单例对象为什么用静态对象,而不是new 呢? 2、设计模式之观察者模式 3、如果是服务端,如果有地方用到大量的if else 或者switch,可以用该思路实现 另外该实现有点类似于qt的signal/slot  :) 以下是栗子了: *********分割线************************************

邓校长的编程课堂专栏 1220

C++ 智能指针中的 std::weak_ptr 全面讲解

是管理共享资源时的重要工具,它通过不增加引用计数来避免循环引用问题,确保对象能够被正确销毁。在实际开发中,常用于缓存、观察者模式以及其他需要弱引用的场景。通过合理使用,可以有效地管理资源,避免内存泄漏。

m0_72877724的博客 772

Day 3 学习计划:智能指针与资源管理(C++11 重点)

智能指针是一种类模板,用来自动管理内存(RAII 原则实现)避免手动delete,防止内存泄漏shared_ptr和unique_ptr的使用总结weak_ptr的使用场景代码面试题答案归纳LeetCode 题解与思路观察者模式的结构图 + 代码实现(可类比 Qt 的信号槽机制)

苦哈哈的 C++ 程序员,写这个技术博客不是为了装逼,也不是为了立人设,是为了收割流量 309

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

C++ 设计模式-观察者模式 参考网址:https://blog.youkuaiyun.com/wuzhekai1985/article/details/6674984 观察者模式 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。 基于C++继承方式实现 #...

wangdamingll的博客 255
上一篇: Linux C++编译及g++使用操作
下一篇: Linux中C++ gdb调试命令
照书抄代码
博客等级 码龄8年 32粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值