观察者模式通过定义一对多依赖关系实现对象间解耦,当主题状态改变时自动通知所有观察者;C++中可通过抽象基类结合虚函数实现多态更新,或使用std::function注册回调提升灵活性,需注意避免通知时修改列表、防止悬挂指针及多线程同步问题,适用于事件系统与数据绑定等场景。

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。在C++中,我们可以通过抽象基类、指针或引用管理观察者列表来实现这一模式。
在实现前,先明确两个关键角色:
这是最常见且类型安全的实现方式。通过虚函数实现多态,让不同观察者响应同一通知。
// Observer.h#ifndef OBSERVER_H
#define OBSERVER_H
立即学习“C++免费学习笔记(深入)”;
class Subject;
class Observer {
public:
virtual ~Observer() = default;
virtual void update(Subject* subject) = 0;
};
#endif
// Subject.h
#ifndef SUBJECT_H
#define SUBJECT_H
#include <vector>
#include <algorithm>
class Observer;
class Subject {
private:
std::vector<Observer*> observers;
protected:
void notify() {
for (auto observer : observers) {
observer->update(this);
}
}
public:
virtual ~Subject() = default;
void attach(Observer* o) {
observers.push_back(o);
}
void detach(Observer* o) {
observers.erase(
std::remove(observers.begin(), observers.end(), o),
observers.end());
}
};
#endif
// 具体主题示例:温度传感器
#include "Subject.h"
#include <iostream>
class TemperatureSensor : public Subject {
private:
double temperature;
public:
double getTemperature() const { return temperature; }
void setTemperature(double temp) {
temperature = temp;
notify(); // 状态变化,通知所有观察者
}
};
// 具体观察者示例
#include "Observer.h"
#include "Subject.h"
#include <iostream>
class Display : public Observer {
public:
void update(Subject* subject) override {
if (auto* sensor = dynamic_cast<TemperatureSensor*>(subject)) {
std::cout << "Display: 温度更新为 " << sensor->getTemperature() << "°C\n";
}
}
};
如果不需要严格的类继承结构,可以用函数指针或std::function来注册回调,使代码更简洁。
#include <functional>
#include <vector>
class EventPublisher {
private:
std::vector<std::function<void()>> listeners;
public:
void subscribe(std::function<void()> func) {
listeners.push_back(func);
}
void notify() {
for (const auto& f : listeners) {
f();
}
}
};
// 使用示例:
EventPublisher pub;
pub.subscribe([]() { std::cout << "事件触发!\n"; });
pub.notify();
在实际使用中需要注意以下几点:
基本上就这些。观察者模式能有效解耦对象间的通信,适合实现事件系统、GUI组件更新、数据绑定等场景。C++中通过虚函数或多态函数对象都能灵活实现,关键是根据项目需求选择合适的抽象层级。
以上就是C++怎么实现观察者模式_C++设计模式与观察者模式实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号