首页 > 编程语言 >C++发布订阅者模式:实现简单消息传递系统

C++发布订阅者模式:实现简单消息传递系统

时间:2024-03-17 09:01:58浏览次数:18  
标签:订阅 Publisher C++ Subscriber 发布者 消息传递 include Event

 

概述:这个C++示例演示了发布者-订阅者模式的基本实现。通过 `Event` 类,发布者 `Publisher` 发送数据,而订阅者 `Subscriber` 订阅并处理数据。通过简单的回调机制,实现了组件间松散耦合的消息传递。

好的,我将为你提供一个简单的C++实例,演示如何使用发布者-订阅者模式。在这个例子中,我们将使用C++11的标准库中的 <functional> 头文件,以及线程支持。

首先,我们定义一个简单的事件类,该事件类将用于携带消息:

// Event.h
#pragma once

#include <functional>

template <typename... Args>
class Event {
public:
    using Callback = std::function<void(Args...)>;

    void subscribe(Callback callback) {
        callbacks_.emplace_back(std::move(callback));
    }

    void notify(Args... args) const {
        for (const auto& callback : callbacks_) {
            callback(args...);
        }
    }

private:
    std::vector<Callback> callbacks_;
};

接下来,我们定义一个发布者类,它将包含一个事件对象,并提供一个方法来触发该事件:

// Publisher.h
#pragma once

#include "Event.h"

class Publisher {
public:
    Event<int> onDataReceived;

    void sendData(int data) {
        // 假设在这里进行一些数据处理
        onDataReceived.notify(data);
    }
};

然后,我们定义一个订阅者类,它将订阅发布者的事件并定义处理函数:

// Subscriber.h
#pragma once

#include "Event.h"
#include <iostream>

class Subscriber {
public:
    void processData(int data) {
        std::cout << "Received data: " << data << std::endl;
    }
};

最后,我们将创建一个主函数来演示发布者和订阅者的使用:

// main.cpp
#include "Publisher.h"
#include "Subscriber.h"
#include <thread>

int main() {
    Publisher publisher;
    Subscriber subscriber;

    // 订阅者订阅发布者的事件
    publisher.onDataReceived.subscribe([&subscriber](int data) {
        subscriber.processData(data);
    });

    // 模拟数据发送
    for (int i = 1; i <= 5; ++i) {
        publisher.sendData(i);
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}

在这个例子中,我们创建了一个简单的发布者 Publisher 类,它包含一个 Event 对象,该对象具有整数参数类型。订阅者 Subscriber 类定义了一个处理函数 processData,该函数将在收到数据时被调用。在主函数中,我们创建了发布者和订阅者的实例,并通过调用 onDataReceived.subscribe 将订阅者订阅到发布者的事件。然后,我们通过调用 sendData 模拟发布者发送数据,订阅者的处理函数将被调用。

这只是一个简单的示例,实际应用中可能需要更复杂的实现,以处理多个事件和更多的数据类型。

 

标签:订阅,Publisher,C++,Subscriber,发布者,消息传递,include,Event
From: https://www.cnblogs.com/hanbing81868164/p/18078072

相关文章

  • C++文件操作实战:创建、写入、读取、修改文件一应俱全
     概述:此C++示例详解文件操作:创建、删除、判断存在、写入、读取和修改文件内容。清晰演示了常见文件处理方法及源代码实现。以下是一个简单的C++实例,演示如何进行文件操作,包括创建文件、删除文件、判断文件是否存在、向文件写入内容、读取文件内容以及修改文件内容。#include......
  • C++ 简单使用Json库与muduo网络库
    C++简单使用Json库与muduo网络库C++使用Json库测试代码均在Ubuntu20上运行首先下载json.hpp的代码链接然后和你的测试代码放在同一目录下面导入方式#include"json.hpp"usingjson=nlohmann::json;json序列化代码测试1voidtest1(){jsonjs;js["id"]={1......
  • UG NX二次开发(C++)-创建样条曲线(二)-UF_MODL_create_spline使用
    系列文章目录第一章、UGNX二次开发(C++)-创建样条曲线(一)-UF_CURVE_create_spline使用第二章、UGNX二次开发(C++)-创建样条曲线(二)-UF_MODL_create_spline使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录第一章、[UGN......
  • C++ STL第三篇(搞清楚deque原理和有多少用法)
    dequeVector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异,一在于deque允许......
  • (C++)DP动态规划
    天下苦DP久已。​ DP非常重要,2022年蓝桥杯应该改名为DP杯,至于2023年那个我觉得应该叫做暴力杯。​ DP的核心思想在于,通过前面几个状态来推导下一个数据是什么,也就是走一步是一步。其本质实际上是记忆化搜索,但是有些玄学的事情就是,有时候记忆化会因为玄学递归问题TLE,但DP的那四......
  • c++机试一些提示
    1、优先队列的使用,头文件#include;优先队列定义:priority_queue<int,vector<int>,greater<int>>pq;(整数数据类型,小顶堆)。例题:哈夫曼树#include<iostream>#include<queue>usingnamespacestd;intmain(){intn;cin>>n;priority_queue<i......
  • 华为OD机试 C++ -文件缓存系统
    文件缓存系统前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于大厂机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:[email protected];备注:CSDN。题目描述请设计一个文件缓......
  • C++ 枚举
    C++枚举5.4.1普通枚举枚举的定义:,枚举类型是通过enum关键字定义的,比如定义颜色类型enumColor{RED,//默认值为0GREEN,//默认值为1BLUE//默认值为2};ColormyColor=RED;注意:(1)括号内为以逗号分隔,大括号结尾要有分号(2)枚举类型就相当于......
  • 10. C++关键字virtual用法
    1.C++关键字:virtual用法1.1概念virtual是C++OO机制中很重要的一个关键字。主要用在两个方面:虚函数、纯虚函数和虚基类、虚继承。1.2虚函数virtual放在函数的返回值前面,用于表示该类成员函数为虚函数;父类虚函数前的virtual必须写;子类虚函数前的virtual可以省略,因为不......
  • 使用c++容器string相关完成
    //把邮箱地址字符串[email protected],取出其中用户名字符串打印stringgetUsername(string&s){   intpops=s.find('@');   stringusername=s.substr(0,pops);   returnusername;}//大小写转换 使用标准库提供俩函数,单个字符为操作对象stringstr=......