c++如何实现观察者设计模式_c++设计模式之观察者模式实现方法

2次阅读

观察者模式通过抽象基类定义更新接口,被观察者维护观察者列表并通知其状态变化。使用指针管理依赖关系时需注意生命周期,避免悬空指针,推荐结合智能指针提升安全性。

c++如何实现观察者设计模式_c++设计模式之观察者模式实现方法

观察者模式是一种行为设计模式,用于在对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知。在c++中,可以通过抽象基类和指针或引用管理观察者来实现这一模式。

定义观察者接口

观察者角色通常由一个抽象基类表示,其中包含一个更新函数,所有具体观察者都需要实现该函数。

  • 定义一个虚函数 update(),供被观察者调用以通知状态变化
  • 观察者可以是任意数量的具体类,只需继承该接口即可

class Observer { public:     virtual ~Observer() = default;     virtual void update() = 0; };

定义被观察者(主题)类

被观察者负责维护观察者列表,并在状态变化时通知它们。

  • 使用容器(如 std::vector)存储观察者指针
  • 提供添加、删除和通知观察者的方法
  • 注意避免空指针或悬空指针问题

#include <vector> #include <algorithm>  class Subject { private:     std::vector<Observer*> observers;  public:     void attach(Observer* obs) {         observers.push_back(obs);     }      void detach(Observer* obs) {         observers.erase(             std::remove(observers.begin(), observers.end(), obs),             observers.end()         );     }      void notify() {         for (auto* obs : observers) {             obs->update();         }     } };

实现具体观察者

具体观察者实现自己的响应逻辑,比如打印信息或更新自身状态。

c++如何实现观察者设计模式_c++设计模式之观察者模式实现方法

Tunee AI

新一代ai音乐智能体

c++如何实现观察者设计模式_c++设计模式之观察者模式实现方法 1104

查看详情 c++如何实现观察者设计模式_c++设计模式之观察者模式实现方法

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

  • 继承 Observer 类并重写 update()
  • 可以在构造时注册到某个被观察者

class ConcreteObserver : public Observer { private:     int observerId;  public:     ConcreteObserver(int id) : observerId(id) {}      void update() override {         std::cout << "Observer " << observerId << " received update!n";     } };

完整示例与使用

将上述部分组合,演示如何注册多个观察者并触发通知。

#include <iostream>  int main() {     Subject subject;     ConcreteObserver obs1(1);     ConcreteObserver obs2(2);      subject.attach(&obs1);     subject.attach(&obs2);      subject.notify();  // 输出两条消息      subject.detach(&obs1);     subject.notify();  // 只有 obs2 收到通知      return 0; }

基本上就这些。通过抽象接口和动态绑定,C++能很好地支持观察者模式。关键是管理好生命周期,避免野指针。如果需要更安全的管理,可以用 std::weak_ptr 配合 std::shared_ptr 实现自动清理。

text=ZqhQzanResources