c++实现观察者模式(附带源码)
·
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都能得到通知并自动更新。这个模式常用于事件驱动系统、GUI应用程序中,或者任何需要发布/订阅的场景。
以下是C++实现观察者模式的完整源代码:
项目实现思路
-
定义主题(Subject):
- 主题是被观察的对象,它维护一个观察者的列表,当状态发生变化时,通知所有观察者。
-
定义观察者(Observer):
- 观察者是关注主题状态变化的对象。当主题状态发生变化时,观察者会得到通知并更新自身状态。
-
抽象观察者(Observer):
- 创建一个抽象的观察者类,定义一个更新接口,具体的观察者实现这个接口来响应主题状态的变化。
-
抽象主题(Subject):
- 创建一个抽象的主题类,定义添加、删除观察者的接口,以及通知观察者的方法。
-
具体实现:
- 创建具体的主题类,继承自抽象主题类,实现状态变化时通知观察者。
- 创建具体的观察者类,实现抽象观察者的接口。
C++ 完整源代码
#include <iostream>
#include <vector>
#include <algorithm>
// 抽象观察者类
class Observer {
public:
virtual ~Observer() {}
virtual void update(int state) = 0; // 更新方法,观察者在主题状态变化时会被调用
};
// 抽象主题类
class Subject {
public:
virtual ~Subject() {}
virtual void attach(Observer* observer) = 0; // 添加观察者
virtual void detach(Observer* observer) = 0; // 删除观察者
virtual void notify() = 0; // 通知所有观察者
};
// 具体观察者类
class ConcreteObserver : public Observer {
private:
int observerState; // 观察者的状态
std::string name; // 观察者的名称
public:
ConcreteObserver(std::string observerName) : name(observerName), observerState(0) {}
void update(int state) override {
observerState = state;
std::cout << "Observer " << name << " updated with state: " << observerState << std::endl;
}
};
// 具体主题类
class ConcreteSubject : public Subject {
private:
std::vector<Observer*> observers; // 观察者列表
int subjectState; // 主题的状态
public:
ConcreteSubject() : subjectState(0) {}
// 添加观察者
void attach(Observer* observer) override {
observers.push_back(observer);
}
// 删除观察者
void detach(Observer* observer) override {
observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
}
// 通知所有观察者
void notify() override {
for (Observer* observer : observers) {
observer->update(subjectState); // 通知每个观察者更新状态
}
}
// 设置主题的状态,并通知所有观察者
void setState(int state) {
subjectState = state;
std::cout << "Subject state updated to: " << subjectState << std::endl;
notify(); // 通知观察者
}
int getState() const {
return subjectState;
}
};
// 测试观察者模式
int main() {
// 创建主题对象
ConcreteSubject subject;
// 创建观察者对象
ConcreteObserver observer1("Observer 1");
ConcreteObserver observer2("Observer 2");
ConcreteObserver observer3("Observer 3");
// 注册观察者
subject.attach(&observer1);
subject.attach(&observer2);
subject.attach(&observer3);
// 改变主题的状态,所有观察者都会收到通知
subject.setState(10);
std::cout << "\nDetaching Observer 2...\n";
subject.detach(&observer2); // 从观察者列表中移除观察者2
// 改变主题的状态,观察者2不会再收到通知
subject.setState(20);
return 0;
}
代码解释
-
抽象观察者类(Observer):
Observer类定义了update()方法,所有观察者类都需要实现这个方法,以便在主题状态变化时更新自身的状态。
-
抽象主题类(Subject):
Subject类提供了添加、删除观察者的接口,attach()用于注册观察者,detach()用于注销观察者,notify()用于通知所有观察者。
-
具体观察者类(ConcreteObserver):
ConcreteObserver继承自Observer,并实现了update()方法,用于更新观察者的状态。
-
具体主题类(ConcreteSubject):
ConcreteSubject继承自Subject,并实现了具体的观察者管理(如添加、删除)和状态更新功能。当主题的状态发生变化时,调用notify()方法通知所有观察者。
-
主函数(main):
- 创建了一个
ConcreteSubject对象(即主题),并创建了三个ConcreteObserver对象(即观察者)。注册观察者后,当主题的状态发生变化时,所有观察者都会收到通知并更新状态。
- 创建了一个
项目总结
观察者模式是一种常见的设计模式,用于处理一对多的关系。通过观察者模式,主题对象的状态发生变化时,所有的观察者都能够实时获得更新,从而避免了对象间的紧密耦合。本示例展示了C++如何实现该模式,包括了添加、删除观察者以及通知观察者的基本实现。
在实际应用中,观察者模式非常适用于事件驱动的系统、GUI编程和消息发布系统等场景。例如,Qt框架的信号与槽机制、Java的EventListener机制等,都是基于观察者模式的应用。
此实现比较基础,未来可以进行扩展,比如为观察者添加更多的状态、支持事件类型等功能,也可以考虑加入线程安全机制,以应对多线程环境中的并发访问问题。
更多推荐
所有评论(0)