观察者模式

时间:2024-03-22 21:20:51
#include <iostream> #include <vector> // 定义主题接口 class Subject { public: virtual ~Subject() {} // 注册/移除观察者 virtual void registerObserver(void(*callback)(const std::string&)) = 0; virtual void removeObserver(void(*callback)(const std::string&)) = 0; // 主题状态改变时通知所有观察者 virtual void notifyObservers(const std::string& message) = 0; }; // 具体主题类 class ConcreteSubject : public Subject { private: std::vector<void(*)(const std::string&)> observers; public: void registerObserver(void(*callback)(const std::string&)) override { observers.push_back(callback); } void removeObserver(void(*callback)(const std::string&)) override { observers.erase(std::remove(observers.begin(), observers.end(), callback), observers.end()); } void notifyObservers(const std::string& message) override { for (auto& observer : observers) { observer(message); } } // 状态改变的方法 void changeState(const std::string& newState) { std::cout << "Subject state changed to: " << newState << std::endl; notifyObservers(newState); } }; // 观察者类(这里直接使用全局函数作为回调) void observerA(const std::string& message) { std::cout << "Observer A received message: " << message << std::endl; } void observerB(const std::string& message) { std::cout << "Observer B received message: " << message << std::endl; } int main() { ConcreteSubject subject; // 注册观察者 subject.registerObserver(observerA); subject.registerObserver(observerB); // 改变主题状态并触发通知 subject.changeState("New State"); return 0; }