C++实现发布订阅机制
发布订阅机制是一种常用的消息传递模式,它允许多个订阅者接收来自发布者的消息。在这种模式中,发布者和订阅者之间没有直接的联系,而是通过一个中间件(即消息代理)来传递消息。
实际应用
在实际应用中,发布订阅机制可以帮助我们更好地管理和扩展应用程序的功能。例如,我们可以使用发布订阅机制来实现不同的功能模块之间的通信,这样就可以在不修改应用程序本身的情况下添加新功能。
代码示例
1. 简单发布订阅
下面是一个简单的代码示例,演示了如何使用C++实现发布订阅机制:
#include <iostream>
#include <string>
#include <vector>
#include <functional>
class Publisher {
public:
void publish(const std::string& message) {
for (const auto& callback : subscribers) {
callback(message);
}
}
void subscribe(std::function<void(const std::string&)> callback) {
subscribers.push_back(callback);
}
private:
std::vector<std::function<void(const std::string&)>> subscribers;
};
int main() {
Publisher publisher;
publisher.subscribe([](const std::string& message) {
std::cout << "Subscriber 1 received: " << message << '\n';
});
publisher.subscribe([](const std::string& message) {
std::cout << "Subscriber 2 received: " << message << '\n';
});
publisher.publish("Hello, World!");
}
上面的代码演示了如何使用C++实现一个简单的发布订阅机制。在这个示例中,我们定义了一个Publisher
类,它包含两个方法:publish
和subscribe
。publish
方法用于向所有订阅者发送消息,而subscribe
方法用于注册新的订阅者。
2. 异步发布订阅
异步发布订阅机制可以通过多线程或事件循环来实现。在多线程实现中,每个订阅者都可以在单独的线程中运行,这样就可以并行处理来自发布者的消息。在事件循环实现中,可以使用异步I/O库(如libuv或Boost.Asio)来管理事件循环,当有新消息到达时,事件循环会调用相应的回调函数来处理消息。
下面是一个简单的代码示例,演示了如何使用C++11的std::async
函数来实现异步发布订阅机制:
#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <future>
class Publisher {
public:
void publish(const std::string& message) {
for (const auto& callback : subscribers) {
std::async(std::launch::async, callback, message);
}
}
void subscribe(std::function<void(const std::string&)> callback) {
subscribers.push_back(callback);
}
private:
std::vector<std::function<void(const std::string&)>> subscribers;
};
int main() {
Publisher publisher;
publisher.subscribe([](const std::string& message) {
std::cout << "Subscriber 1 received: " << message << '\n';
});
publisher.subscribe([](const std::string& message) {
std::cout << "Subscriber 2 received: " << message << '\n';
});
publisher.publish("Hello, World!");
}
上面的代码演示了如何使用std::async
函数来实现异步发布订阅机制。在这个示例中,我们定义了一个Publisher
类,它包含两个方法:publish
和subscribe
。publish
方法用于向所有订阅者发送消息,而subscribe
方法用于注册新的订阅者。与同步版本不同的是,在异步版本中,我们使用std::async
函数来异步调用订阅者的回调函数。