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

在C++中实现一个简单的发布/订阅(Pub/Sub)系统,核心是让消息的发送者(发布者)与接收者(订阅者)解耦。订阅者可以注册自己感兴趣的事件或主题,当某个主题有消息发布时,所有订阅该主题的观察者都会收到通知。
基本设计思路
使用观察者模式结合回调机制来实现。关键组件包括:
- EventBus(事件总线):管理主题和订阅者的映射关系,负责消息分发。
- Topic(主题):用字符串标识不同的消息通道。
- Callback:订阅者提供的处理函数,用于响应消息。
- Subscribe / Publish 接口:供外部调用的注册和发送方法。
使用std::function和std::map实现
下面是一个轻量级实现示例:
#include#include
使用示例
定义几个简单的回调函数模拟不同订阅者:
立即学习“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,可支持任意数据结构。
- 引入引用计数或智能指针避免悬挂回调。











