c++怎么实现一个简单的发布/订阅系统_c++发布订阅(Pub/Sub)模式实现方法

答案:使用观察者模式和std::function实现事件总线,通过map管理主题与回调,支持订阅/发布,示例含日志与告警响应,可扩展线程安全与模板化。

c++怎么实现一个简单的发布/订阅系统_c++发布订阅(pub/sub)模式实现方法

在C++中实现一个简单的发布/订阅(Pub/Sub)系统,核心是让消息的发送者(发布者)与接收者(订阅者)解耦。订阅者可以注册自己感兴趣的事件或主题,当某个主题有消息发布时,所有订阅该主题的观察者都会收到通知。

基本设计思路

使用观察者模式结合回调机制来实现。关键组件包括:

EventBus(事件总线):管理主题和订阅者的映射关系,负责消息分发。 Topic(主题):用字符串标识不同的消息通道。 Callback:订阅者提供的处理函数,用于响应消息。 Subscribe / Publish 接口:供外部调用的注册和发送方法。

使用std::function和std::map实现

下面是一个轻量级实现示例:

#include #include #include #include #include class EventBus {public:    using Callback = std::function;    // 订阅某个主题    void subscribe(const std::string& topic, const Callback& callback) {        callbacks_[topic].push_back(callback);    }    // 发布消息到指定主题    void publish(const std::string& topic, const std::string& message) {        auto it = callbacks_.find(topic);        if (it != callbacks_.end()) {            for (const auto& cb : it->second) {                cb(message);            }        }    }private:    std::map<std::string, std::vector> callbacks_;};

使用示例

定义几个简单的回调函数模拟不同订阅者:

立即学习“C++免费学习笔记(深入)”;

void logger(const std::string& msg) {    std::cout << "[Logger] Received: " << msg << "n";}void alert_system(const std::string& msg) {    std::cout << "[Alert] !! " << msg << " !!" << "n";}int main() {    EventBus bus;    // 订阅主题    bus.subscribe("logs", logger);    bus.subscribe("alerts", alert_system);    bus.subscribe("alerts", [](const std::string& msg) {        std::cout << "[Popup] " << msg << "n";    });    // 发布消息    bus.publish("logs", "System started");    bus.publish("alerts", "High CPU usage!");    return 0;}

输出结果:

[Logger] Received: System started
[Alert] !! High CPU usage! !!
[Popup] High CPU usage!

扩展建议

这个基础版本可以按需增强:

支持取消订阅(unsubscribe),通过返回订阅ID或使用weak_ptr管理生命周期。 使用线程安全队列和互斥锁,支持多线程发布/订阅。 模板化消息类型,不只是string,可支持任意数据结构。 引入引用计数或智能指针避免悬挂回调。基本上就这些。不复杂但容易忽略的是回调生命周期管理——确保订阅者在被调用时仍然有效。简单场景下,手动控制对象生命周期即可。

以上就是c++++怎么实现一个简单的发布/订阅系统_c++发布订阅(Pub/Sub)模式实现方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1480128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 04:22:13
下一篇 2025年12月19日 04:22:21

相关推荐

发表回复

登录后才能评论
关注微信