用C++观察者模式实现LiveData类

 1 #ifndef LIVE_DATA_H
 2 #define LIVE_DATA_H
 3 
 4 #include <mutex>
 5 #include <vector>
 6 #include <functional>
 7 
 8 template <typename T>
 9 class LiveData
10 {
11 
12 public:
13     LiveData(const T& initialValue) : m_Data(initialValue) {}
14 
15     // 注册观察者
16     void observe(const std::function<void(const T&)>& observer) {
17         std::lock_guard<std::mutex> lock(m_Mutex);
18         m_Observers.push_back(observer);
19     }
20 
21     // 取消观察
22     void unobserve(const std::function<void(const T&)>& observer) {
23         std::lock_guard<std::mutex> lock(m_Mutex);
24         auto it = std::find(m_Observers.begin(), m_Observers.end(), observer);
25         if (it != m_Observers.end()) {
26             m_Observers.erase(it);
27         }
28     }
29 
30     // 更新数据
31     void setValue(const T& newValue) {
32         T localData;
33         {
34             std::lock_guard<std::mutex> lock(m_Mutex);
35             m_Data = newValue;
36             localData = newValue;
37         }
38         notifyObservers(localData);
39     }
40 
41 private:
42     // 通知所有观察者
43     void notifyObservers(T localData) {
44         std::vector<std::function<void(const T&)>> localObservers;
45         {
46             std::lock_guard<std::mutex> lock(m_Mutex);
47             localObservers = m_Observers;  // 复制观察者列表,减少锁的持有时间
48         }
49         for (const auto& observer : localObservers) {
50             try {
51                 observer(localData);
52             }
53             catch (...) {
54                 //std::cerr << "Exception occurred while notifying observer." << std::endl;
55             }
56         }
57     }
58 
59 private:
60     T m_Data{};
61     std::vector<std::function<void(const T&)>> m_Observers{};
62     mutable std::mutex m_Mutex{};
63 
64 };
65 
66 #endif // !LIVE_DATA_H

 

 

使用方法:

#include "LiveData.h"

#include <iostream>

// 全局函数作为观察者
void globalObserver(const int& value) {
    std::cout << "Global observer received new value: " << value << std::endl;
}

class ObserverClass {
public:
    // 类的静态函数作为观察者
    static void staticObserver(const int& value) {
        std::cout << "Static observer received new value: " << value << std::endl;
    }

    // 对象的普通函数作为观察者
    void memberObserver(const int& value) {
        std::cout << "Member observer received new value: " << value << std::endl;
    }
};

int main() {
    LiveData<int> observable(10);

    // 注册全局函数观察者
    observable.observe(globalObserver);

    // 注册类的静态函数观察者
    observable.observe(ObserverClass::staticObserver);

    // 创建类的对象
    ObserverClass observerObj;
    // 注册对象的普通函数观察者,需要使用 std::bind 绑定对象实例
    observable.observe(std::bind(&ObserverClass::memberObserver, &observerObj, std::placeholders::_1));

    // 定义 lambda 函数作为观察者
    auto lambdaObserver = [](const int& value) {
        std::cout << "Lambda observer received new value: " << value << std::endl;
    };
    observable.observe(lambdaObserver);

    // 更新数据
    observable.setValue(20);

    return 0;
}

 

posted @ 2025-02-19 18:07  禅元天道  阅读(26)  评论(0)    收藏  举报