观察者(Observer)模式-C++实现

基本结构
  • 主体(Subject)类:即被观察者类的基类,它管理所有的观察者,并提供添加和删除观察者的方法,观察者的数量一般不受限制。
  • 观察者(Observer)类:定义一个通知接口来接收主体类发来的通知消息
  • 具体的主体(ConcreteSubject)类:即具体的被观察者类,它针对不同的需求,实现具体的主体属性和方法,决定何时发送通知消息等。
  • 具体的观察者(ConcreteObserver)类:针对不同的需求,实现具体的通知接口,以接收具体的主体类发来的通知消息,并可以根据需要对消息进行特定的处理。
C++语言的实现
class Observer
{
public:
       virtual void Update(Subject* theChangedSubject) = 0;
};

class Subject
{
public:
       virtual void AddObserver(Observer *o)
       {
              _observers.push_back(o); //在List中添加一个观察者
       }

       virtual void Notify()
       {
              std::list<Observer *>::iterator i;
              for (i = _observers.begin(); i != _observers.end(); i++)
              {
                     (*i)->Update(this);     //调用所有的观察者的Updata()方法
              }
       }
private:
       std::list<Observer *> _observers;
};

在这种实现方式中,程序里具体的观察者类都是Observer类的派生类,他们实现了Update()接口的细节。具体的主体类是Subject类的派生类,他们的职责通常是管理被观察者的状态,实现GetState()和SetState()方法,以及在状态发生变化时调用基类的Notify()方法。

查询状态

观察者得到通知消息后,往往需要知道究竟是Subject类中对哪个状态发生了变化,发生了何种变化。这时,有两种方法传递Subject类的状态信息:
(1)可以在通知接口(update)中定义一个参数结构,Subject类发送通知时,也把相应的状态描述数据打包在参数结构中,直接传送出去。这时Update()方法的参数就是这个参数结构结构。
(2)类似上面的C++语言实现,在通知接口(Update)中不传送这些信息,而是在观察者得到通知后,再反过来调用Subject中查询状态的函数,以获知究竟是哪个状态发生了变化,发生了何种变化,

总结
  • 观察者模式可以消除被观察者对观察者的直接依赖
posted @   Wang_h_f  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示