C++發布訂閱者模式:實現簡單消息傳遞系統
概述:這個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 模擬發布者發送數據,訂閱者的處理函數將被調用。
這只是一個簡單的示例,實際應用中可能需要更復雜的實現,以處理多個事件和更多的數據類型。