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

C++中如何实现观察者模式_观察者模式代码示例与解析

穿越時空
发布: 2025-08-01 11:42:01
原创
756人浏览过

观察者模式是一种行为型设计模式,其核心在于定义一种一对多的依赖关系,使多个观察者对象能同时监听某一主题对象,当主题状态变化时,所有观察者会收到通知并自动更新。实现该模式需包含四个核心组件:subject(维护观察者列表并通知其更新)、observer(定义更新接口)、concretesubject(管理具体状态并在变化时通知观察者)、concreteobserver(实现具体更新逻辑)。优点包括松耦合、可扩展性强、符合开闭原则;缺点涉及通知顺序不确定、可能产生循环依赖、性能受影响。常见应用场景有gui事件处理、mvc架构中模型与视图同步、消息队列、电子表格联动等。为避免循环依赖,可通过解耦设计、引入中间层、状态检查或限制更新次数等方式解决。

C++中如何实现观察者模式_观察者模式代码示例与解析

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生改变时,所有依赖它的观察者都会收到通知并自动更新。简单来说,就是“发布-订阅”模型。

C++中如何实现观察者模式_观察者模式代码示例与解析

解决方案

C++中如何实现观察者模式_观察者模式代码示例与解析

C++中实现观察者模式,通常需要以下几个核心组件:

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

C++中如何实现观察者模式_观察者模式代码示例与解析
  1. Subject (主题/被观察者):维护一个观察者列表,提供添加、删除观察者的方法,并在状态改变时通知观察者。
  2. Observer (观察者):定义一个更新接口,当接收到主题的通知时,执行相应的更新操作。
  3. ConcreteSubject (具体主题):继承自Subject,实现具体的状态管理,并在状态改变时调用通知方法。
  4. ConcreteObserver (具体观察者):继承自Observer,实现具体的更新逻辑,响应主题的状态变化。

下面是一个简单的C++代码示例:

#include <iostream>
#include <vector>

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

// Subject 类
class Subject {
private:
    std::vector<Observer*> observers;
    int state;

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

    void detach(Observer* observer) {
        //  找到并移除观察者
        for (size_t i = 0; i < observers.size(); ++i) {
            if (observers[i] == observer) {
                observers.erase(observers.begin() + i);
                return;
            }
        }
    }

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

    int getState() {
        return state;
    }

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

// ConcreteObserver 类
class ConcreteObserver : public Observer {
private:
    std::string name;
    Subject* subject;
    int observerState;

public:
    ConcreteObserver(std::string name, Subject* subject) : name(name), subject(subject) {}

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

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

    ConcreteObserver* observer1 = new ConcreteObserver("A", subject);
    ConcreteObserver* observer2 = new ConcreteObserver("B", subject);

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

    subject->setState(1);
    subject->setState(2);

    subject->detach(observer1); //  移除观察者1

    subject->setState(3);

    delete observer1;
    delete observer2;
    delete subject;

    return 0;
}
登录后复制

这个例子中,

Subject
登录后复制
维护了一个
state
登录后复制
,当
state
登录后复制
改变时,会通知所有注册的
Observer
登录后复制
ConcreteObserver
登录后复制
则实现了
update
登录后复制
方法,接收
state
登录后复制
的变化并打印出来。

观察者模式的优点和缺点是什么?

千图设计室AI海报
千图设计室AI海报

千图网旗下的智能海报在线设计平台

千图设计室AI海报 227
查看详情 千图设计室AI海报

优点:

  • 松耦合: 主题和观察者之间是抽象耦合,主题不需要知道具体观察者的类型。
  • 可扩展性: 可以方便地增加新的观察者,而无需修改主题的代码。
  • 符合开闭原则: 对修改关闭,对扩展开放。

缺点:

  • 通知顺序不确定: 观察者的更新顺序是不确定的,可能导致一些问题。
  • 循环依赖: 如果观察者和主题之间存在循环依赖,可能导致死循环。
  • 性能问题: 如果观察者过多,通知所有观察者可能会影响性能。

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

观察者模式应用广泛,例如:

  • GUI框架: 按钮点击事件、文本框内容改变等。
  • 消息队列: 发布者发布消息,订阅者接收消息。
  • 模型-视图-控制器 (MVC) 架构: 模型状态改变,通知视图更新。
  • 事件处理系统: 各种事件的监听和处理。
  • 电子表格软件: 当一个单元格的数据改变时,依赖于该单元格的其他单元格会自动更新。

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

循环依赖指的是A观察B,B又观察A,导致状态变化时互相通知,陷入死循环。 避免循环依赖的方法:

  • 解耦: 重新设计观察者和主题的关系,避免互相依赖。
  • 使用中间层: 引入一个中间层,让观察者和主题都依赖于中间层,而不是直接互相依赖。
  • 状态检查: 在更新方法中,检查状态是否已经更新过,避免重复更新。
  • 限制更新次数: 设置一个最大更新次数,超过这个次数就停止更新。

在实际开发中,需要根据具体情况选择合适的解决方案。 重要的是理解观察者模式的核心思想,并在实践中灵活运用。

以上就是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号