C++釋出訂閱者模式:實現簡單訊息傳遞系統

架构师老卢發表於2024-03-17
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 模擬釋出者傳送資料,訂閱者的處理函式將被呼叫。

這只是一個簡單的示例,實際應用中可能需要更復雜的實現,以處理多個事件和更多的資料型別。

相關文章