行业知识
C++观察者模式代码实例
2026-10-21 00:13:52
来源:互联网转载
文章目录
- C++观察者模式代码实例一
- C++观察者���式代码实例二
C++观察者模式代码实例一
下面是一个简单的C++观察者模式的实现示例,这里仅给出核心代码框架,完整的工程应包含对应的头文件声明及必要的#include指令等。
// 观察者接口(Observer)class IObserver {public: virtual ~IObserver() {} virtual void update(const std::string& message) = 0; // 更新方法};// 主题接口(Subject)class ISubject {public: virtual ~ISubject() {} virtual void registerObserver(IObserver* observer) = 0; // 注册观察者 virtual void removeObserver(IObserver* observer) = 0; // 移除观察者 virtual void notifyObservers(const std::string& message) = 0; // 通知观察者};// 具体主题(ConcreteSubject)class ConcreteSubject : public ISubject {private: std::vector observers; // 存储观察者列表public: void registerObserver(IObserver* observer) override { observers.push_back(observer); } void removeObserver(IObserver* observer) override { observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end()); } void notifyObservers(const std::string& message) override { for (const auto& obs : observers) { obs->update(message); } } // 其他业务逻辑,当有状态改变时调用notifyObservers() void changeState(const std::string& newState) { // 假设这里有某种状态变更逻辑 std::string message = "状态已更新至:" + newState; notifyObservers(message); }};// 具体观察者(ConcreteObserver)class ConcreteObserver : public IObserver {public: void update(const std::string& message) override { std::cout ConcreteSubject subject; ConcreteObserver observer1; ConcreteObserver observer2; subject.registerObserver(&observer1); subject.registerObserver(&observer2); subject.changeState("New State"); // 当状态变化时,所有观察者都会被通知 return 0;}public: virtual ~IObserver() {} virtual void update(const std::string& message) = 0;};// 主题接口(Subject)class ISubject {public: virtual ~ISubject() {} virtual void attach(std::shared_ptrprivate: std::vector observers.push_back(observer); } void detach(std::shared_ptr observers.erase( std::remove(observers.begin(), observers.end(), observer), observers.end() ); } void notifyObservers(const std::string& message) override { for (const auto& obs : observers) { obs-update(message); } } // 其他业务逻辑...};// 具体观察者(ConcreteObserver)class ConcreteObserver : public IObserver {public: void update(const std::string& message) override { std::cout ConcreteSubject subject; auto observer1 = std::make_shared std::cout std::cout public: void log(const std::string& message) { std::cout Temperature, Humidity, WindSpeed };struct WeatherData { WeatherDataType type; double value;};class ConcreteSubject : public ISubject { // ... void notifyObservers(WeatherData data) override { for (const auto& obs : observers) { obs-update(data); } }};class AdvancedObserver : public IObserver {public: void update(const WeatherData& data) override { std::visit(overloaded{ [&](const auto& value) { if (data.type == WeatherDataType::Temperature) handleTemperature(value); // 处理其他类型... }, }, data.value); }private: void handleTemperature(double temp) { std::cout
下一篇:服务器win12怎么设置?