C++之观察者模式(订阅-发布模式)

定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。Observer模式就是解决了这一个问题。

UML类图:

这里写图片描述

这里的目标Subject提供依赖于它的观察者Observer的注册(Attach)和注销(Detach)操作,并且提供了使得依赖于它的所有观察者同步的操作(Notify)。观察者Observer则提供一个Update操作,注意这里的Observer的Update操作并不在Observer改变了Subject目标状态的时候就对自己进行更新,这个更新操作要延迟到Subject对象发出Notify通知所有Observer进行修改(调用Update)。

代码展示

主题代码:

//subject.h
#ifndef __SUBJECT__H__
#define __SUBJECT__H__
#include "Observer.h"
#include <list>
#include <string>
using namespace std;
class Observer;
class Subject
{
public:
    Subject();
    virtual ~Subject();
    virtual void attach(Observer* obs);
    virtual void detach(Observer* obs);
    virtual void Notify();
    virtual void setState(const string& str) = 0;
    virtual string getState() = 0;

private:

    
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C++观察者模式(Observer Pattern)是一种设计模式,用于在对象之间建立一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并进行相应的更新。 观察者模式由以下几个关键角色组成: 1. 主题(Subject):也被称为被观察者(Observable),它是一个抽象类或接口,定义了添加、删除和通知观察者的方法。主题可以有多个观察者,并在状态发生改变时通知所有观察者。 2. 观察者(Observer):观察者是主题所依赖的对象,当主题的状态发生变化时,观察者会接收到通知并进行相应的更新。观察者一般通过接口或抽象类定义,以便主题可以统一处理不同类型的观察者。 3. 具体主题(Concrete Subject):具体主题是主题类的实现,它维护着一个观察者列表,并在状态发生变化时通知观察者。 4. 具体观察者(Concrete Observer):具体观察者是观察者接口的实现,它定义了收到通知后具体的处理逻辑。每个具体观察者可以有自己的状态和行为,但是它们都通过观察者接口与主题进行交互。 观察者模式的工作流程如下: 1. 主题维护一个观察者列表,并提供添加、删除和通知观察者的方法。 2. 观察者通过实现观察者接口并注册到主题中,以便在状态变化时接收通知。 3. 当主题的状态发生改变时,它会遍历观察者列表并调用每个观察者的更新方法,将状态变化的消息传递给观察者。 4. 观察者在接收到通知后,可以根据自身的需求进行相应的更新操作。 观察者模式的优点包括: - 松耦合:主题和观察者之间是松耦合的,它们可以独立地进行修改和扩展,而不会影响到彼此。 - 可扩展性:可以方便地增加新的观察者或主题,而无需修改现有的代码。 - 面向对象设计原则:符合单一职责原则和开闭原则,使得代码更加可维护和可扩展。 观察者模式在很多场景中都有应用,例如事件驱动系统、GUI 界面开发、发布-订阅模式等。 希望这个介绍对你有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值