观察者(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中查询状态的函数,以获知究竟是哪个状态发生了变化,发生了何种变化,

总结
  • 观察者模式可以消除被观察者对观察者的直接依赖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Finn Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值