小工具知识网

当前位置: 首页 > 行业知识 > C++观察者模式代码实例

行业知识

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怎么设置?