观察者模式详解
2026/9/24 15:57:40 网站建设 项目流程

1. 什么是观察者模式

观察者模式定义了一种一对多的依赖关系:当一个对象(目标)的状态发生改变时,所有依赖它的对象(观察者)都会收到通知并自动更新。

它的核心价值在于解耦——目标不需要知道具体有哪些观察者,观察者也不需要关心目标如何实现,双方只依赖抽象的接口。

2. 模式结构

观察者模式包含两个核心角色:

  • Subject(目标):维护一个观察者列表,提供添加、移除观察者的方法,并在状态变化时通知所有观察者。
  • Observer(观察者):定义统一的更新接口,具体观察者实现该接口来响应通知。

3. 代码示例

下面是一个典型的 C++ 实现:

// 观察者抽象接口classIObserver{public:virtualvoidupdate(floatvalue)=0;virtual~IObserver(){}};// 目标类classSubject{private:std::list<IObserver*>observers;protected:voidnotify(floatvalue){for(auto*ob:observers){ob->update(value);}}public:voidattach(IObserver*ob){observers.push_back(ob);}voiddetach(IObserver*ob){observers.remove(ob);}};// 具体目标classFileSplitter:publicSubject{inttotal;public:voidsplit(){for(inti=0;i<total;i++){// ... 分割文件floatprogress=(i+1.0f)/total;notify(progress);// 通知所有观察者}}};// 具体观察者:进度条classProgressBar:publicIObserver{public:voidupdate(floatvalue)override{std::cout<<"进度: "<<value*100<<"%"<<std::endl;}};

使用时,只需把观察者挂到目标上:

FileSplitter splitter;ProgressBar bar;splitter.attach(&bar);// 订阅通知splitter.split();// 状态变化时自动通知splitter.detach(&bar);// 取消订阅

4. 优点与适用场景

优点:

  1. 目标与观察者之间松耦合,可以独立扩展。
  2. 支持广播通信,一个目标通知多个观察者。
  3. 观察者可动态订阅或取消订阅。

适用场景:

  • 事件驱动的 UI 框架(按钮点击、进度更新)。
  • 消息发布与订阅系统。
  • 数据变化需要同步刷新多个视图的场景。

5. 总结

观察者模式的关键是把「谁需要被通知」从目标类中剥离出去:目标只负责维护观察者列表并调用统一接口,具体的响应逻辑交给观察者自己实现。这样当需要新增或替换通知方式时,不再需要改动目标类,实现了良好的可扩展性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询