用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; }

浙公网安备 33010602011771号