首页 > 后端开发 > C++ > 正文

如何在C++中实现一个观察者模式_C++观察者设计模式实现教程

尼克
发布: 2025-09-20 10:39:01
原创
626人浏览过
观察者模式适用于GUI事件处理、消息队列、发布订阅系统、游戏开发等场景,通过解耦实现一对多状态同步;其与发布-订阅模式区别在于同步 vs 异步、直接依赖 vs 中间解耦。

如何在c++中实现一个观察者模式_c++观察者设计模式实现教程

观察者模式是一种行为设计模式,用于在对象之间建立一种一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会收到通知并自动更新。核心在于解耦,让被观察者和观察者之间的联系更加松散。

#include <iostream>
#include <vector>

class Observer {
public:
    virtual void update(int state) = 0;
};

class Subject {
public:
    virtual void attach(Observer* observer) = 0;
    virtual void detach(Observer* observer) = 0;
    virtual void notify() = 0;
};

class ConcreteSubject : public Subject {
private:
    std::vector<Observer*> observers;
    int state;

public:
    void attach(Observer* observer) override {
        observers.push_back(observer);
    }

    void detach(Observer* observer) override {
        for (auto it = observers.begin(); it != observers.end(); ++it) {
            if (*it == observer) {
                observers.erase(it);
                return;
            }
        }
    }

    void notify() override {
        for (Observer* observer : observers) {
            observer->update(state);
        }
    }

    void setState(int state) {
        this->state = state;
        notify();
    }

    int getState() {
        return state;
    }
};

class ConcreteObserver : public Observer {
private:
    ConcreteSubject* subject;
    int observerState;

public:
    ConcreteObserver(ConcreteSubject* subject) : subject(subject) {}

    void update(int state) override {
        observerState = state;
        std::cout << "Observer state updated to: " << observerState << std::endl;
    }
};

int main() {
    ConcreteSubject* subject = new ConcreteSubject();

    ConcreteObserver* observer1 = new ConcreteObserver(subject);
    ConcreteObserver* observer2 = new ConcreteObserver(subject);

    subject->attach(observer1);
    subject->attach(observer2);

    subject->setState(10);
    subject->setState(20);

    subject->detach(observer1);
    subject->setState(30);

    delete observer1;
    delete observer2;
    delete subject;

    return 0;
}
登录后复制

观察者模式在实际项目中的应用场景有哪些?

观察者模式在很多场景下都非常有用。比如,在GUI编程中,当用户点击一个按钮时,多个组件可能需要响应这个事件。再比如,在消息队列系统中,当有新消息到达时,多个消费者可能需要处理这个消息。 还可以用于实现发布-订阅系统,例如社交媒体中的关注和推送功能。甚至在游戏开发中,角色的状态变化需要通知UI进行更新,也常常使用观察者模式。总的来说,任何需要实现一对多依赖关系,并且希望解耦这些依赖关系的地方,都可以考虑使用观察者模式。

如何避免观察者模式中的循环依赖问题?

立即学习C++免费学习笔记(深入)”;

设计师AI工具箱
设计师AI工具箱

最懂设计师的效率提升平台,实现高效设计出图和智能改图,室内设计,毛坯渲染,旧房改造 ,软装设计

设计师AI工具箱 124
查看详情 设计师AI工具箱

循环依赖是一个需要注意的问题。例如,观察者A更新后通知被观察者B,被观察者B又通知观察者A,这样就形成了一个循环。解决这个问题的方法有很多。一种方法是在更新通知之前,设置一个标志位,表示当前正在更新,避免重复通知。另一种方法是使用更高级的消息队列,例如RabbitMQ或Kafka,它们可以处理复杂的依赖关系,并且可以避免循环依赖。此外,设计时可以考虑引入中间层,例如事件总线,来解耦观察者和被观察者之间的直接依赖关系。

观察者模式与发布-订阅模式有什么区别和联系?

观察者模式和发布-订阅模式经常被混淆,但它们之间还是有一些区别的。观察者模式通常是同步的,被观察者直接调用观察者的更新方法。而发布-订阅模式通常是异步的,发布者将消息发送到消息队列,订阅者从消息队列中获取消息。此外,观察者模式中,观察者通常知道被观察者的存在,而发布-订阅模式中,发布者和订阅者通常不知道彼此的存在,它们通过消息队列进行解耦。 观察者模式可以看作是发布-订阅模式的一个简化版本,更适用于对象之间存在直接依赖关系的情况。而发布-订阅模式更适用于大规模、分布式的系统,需要更高的灵活性和可扩展性。

以上就是如何在C++中实现一个观察者模式_C++观察者设计模式实现教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号