观察者模式用于对象间一对多依赖,状态变更时自动通知所有观察者。2. 主题类维护观察者列表并实现添加、删除及通知方法。3. 观察者接口定义更新函数,由具体观察者实现。4. 以按钮点击为例,按钮为具体主题,UI组件为观察者,点击时通知所有观察者更新。
在C++中,观察者模式是一种行为设计模式,适用于实现对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动收到通知。这种机制非常适合用来实现事件通知系统。
定义主题(Subject)接口
主题是被观察的对象,它维护一个观察者列表,并提供添加、删除和通知观察者的方法。
class Subject { public: virtual ~Subject() = default; virtual void attach(class Observer* observer); virtual void detach(class Observer* observer); virtual void notify();
protected: std::vector<class Observer*> observers; };
void Subject::attach(Observer* observer) { observers.push_back(observer); }
void Subject::detach(Observer* observer) { observers.erase( std::remove(observers.begin(), observers.end(), observer), observers.end() ); }
void Subject::notify() { for (Observer* obs : observers) { obs->update(); } }
定义观察者(Observer)接口
观察者定义接收通知的接口。通常是一个纯虚函数,由具体观察者实现。
class Observer { public: virtual ~Observer() = default; virtual void update() = 0; };
实现具体主题与观察者
以一个简单的按钮点击事件为例。按钮是主题,UI组件是观察者。
立即学习“C++免费学习笔记(深入)”;
class Button : public Subject { public: void click() { std::cout // 触发事件 } };
class StatusBar : public Observer { public: void update() override { std::cout << “StatusBar: Updating status…n”; } };
class Logger : public Observer { public: void update() override { std::cout << “Logger: Log event occurred.n”; } };
使用示例
将观察者注册到主题,当事件发生时自动通知。
int main() { Button btn; StatusBar bar; Logger logger;
btn.attach(&bar); btn.attach(&logger); btn.click(); <font color="#008000">// 输出所有观察者的响应</font> btn.detach(&logger); btn.click(); <font color="#008000">// 只有 StatusBar 收到通知</font> <font color="#0000FF">return</font> 0;
}
基本上就这些。通过继承和多态,C++可以干净地实现观察者模式。注意管理好对象生命周期,避免悬挂指针。如果需要更灵活的通知机制,可以扩展update方法传参,比如传递事件类型或数据。
c++ 点击事件 for void 虚函数 纯虚函数 接口 class public protected 对象 事件 default ui