观察者(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中查询状态的函数,以获知究竟是哪个状态发生了变化,发生了何种变化,
总结
- 观察者模式可以消除被观察者对观察者的直接依赖
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具