### C++中的观察者模式详解 #### 一、观察者模式定义 观察者模式是一种行为设计模式,它定义了一对多的依赖关系,允许多个观察者对象同时监听一个主题对象。当主题对象的状态发生变化时,它会自动通知所有观察者进行相应的更新。这种模式非常适合在以下情况使用: 1. 当一个对象的状态发生改变时,需要通知多个其他对象,并且这些对象之间没有固定的关系。 2. 当一个对象需要维护一系列依赖对象,但又不想紧密耦合这些对象。 #### 二、观察者模式的角色 观察者模式主要包括两个角色:观察者(Observer)和被观察者(Subject)。 - **观察者(Observer)**:观察者是被观察对象变化的通知接收者,它的主要职责是在收到被观察对象的状态变更通知后,更新自身的状态。在C++中,通常通过继承一个基类实现观察者角色,并重写一个更新方法。 - **被观察者(Subject)**:被观察者也称为主题或发布者,它负责维护一组观察者对象,并在自身状态发生变化时通知所有注册的观察者。在C++中,被观察者通常是一个接口或者抽象基类,提供添加、删除观察者的方法以及通知所有观察者的方法。 #### 三、应用场景示例 假设有一个秘书需要通知多个员工老总即将到达的情况,这就可以用观察者模式来实现。秘书作为被观察者,各个员工作为观察者。当秘书得知老总到达的消息时,需要通知所有正在工作的员工。下面是一个具体的实现案例: ```cpp #include <iostream> #include <string> #include <list> using namespace std; // 观察者基类 class Observer { protected: string name; Subject *sub; public: Observer(string name, Subject *sub) { this->name = name; this->sub = sub; } virtual void update() = 0; }; // 股票观察者 class StockObserver : public Observer { public: StockObserver(string name, Subject *sub) : Observer(name, sub){} void update(); }; // NBA观察者 class NBAObserver : public Observer { public: NBAObserver(string name, Subject *sub) : Observer(name, sub){} void update(); }; // 被观察者基类 class Subject { protected: std::list<Observer *> observers; public: string action; // 被观察者对象的状态 virtual void attach(Observer *) = 0; virtual void detach(Observer *) = 0; virtual void notify() = 0; }; // 秘书作为被观察者 class Secretary : public Subject { public: void attach(Observer *observer) { observers.push_back(observer); } void detach(Observer *observer) { list<Observer *>::iterator iter = observers.begin(); while (iter != observers.end()) { if ((*iter) == observer) { observers.erase(iter); return; } ++iter; } } void notify() { list<Observer *>::iterator iter = observers.begin(); while (iter != observers.end()) { (*iter)->update(); ++iter; } } }; void StockObserver::update() { cout << name << " 收到消息:" << sub->action << endl; if (sub->action == "⽼板来了!") { cout << "我马上关闭股票,装做很认真的样子!" << endl; } } ``` #### 四、观察者模式的优点 1. **解耦**:观察者模式使得被观察者和观察者之间的依赖关系最小化。 2. **灵活性**:增加新的观察者非常容易,只需创建新的观察者类并注册即可。 3. **扩展性**:可以在不修改现有代码的情况下添加新的观察者类型。 #### 五、观察者模式的局限性 1. **性能问题**:如果观察者过多,可能会导致性能下降。 2. **循环引用**:在某些情况下,可能导致循环引用的问题,需要小心处理。 #### 六、总结 观察者模式通过定义对象间的一对多依赖关系来实现解耦,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这对于开发灵活、可扩展的软件系统来说非常重要。在实际应用中,观察者模式常用于事件驱动系统的设计,如GUI工具包、游戏开发等场景。
- 粉丝: 594
- 资源: 160
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 学校课程软件工程常见10道题目以及答案demo
- javaweb新手开发中常见的目录结构讲解
- 新手小白的git使用的手册入门学习demo
- 基于Java观察者模式的info-express多对多广播通信框架设计源码
- 利用python爬取豆瓣电影评分简单案例demo
- 机器人开发中常见的几道问题以及答案demo
- 基于SpringBoot和layuimini的简洁美观后台权限管理系统设计源码
- 实验报告五六代码.zip
- hdw-dubbo-ui基于vue、element-ui构建开发,实现后台管理前端功能.zip
- (Grafana + Zabbix + ASP.NET Core 2.1 + ECharts + Dapper + Swagger + layuiAdmin)基于角色授权的权限体系.zip