观察者模式

作用及理解:

一种一对多的消息处理方式。一个消息源的数据可以发给多个接收者,接收者可以灵活增加、减少。
这样,多个接收者可以使用这些数据去进行不同的处理,用于不同地方。

这个模式解决的核心问题是:解除消息源和消息接收者之间的耦合,使消息接收者可以随意增减,而不必修改消息源。

消息源出去的数据是固定的,各个接收者受到的数据都是固定的。

如下图所示,接收者可以随时加入或者退出,加入的接收者都会收到消息
消息源和接收者间的关系

一个简单的例子:

#include<iostream>
#include<cstdio>
#include<list>

struct Msg
{
    int x,y,z;
};

class Observer;
class Subject
{
public:
    Subject()
    {};
    virtual void registerObserver(Observer* o){};
    virtual void removeObserver(Observer* o){};
    virtual void notifyObserver(){};
};

class Observer
{
public:
    virtual void update(Msg m){};
};

class RealSubject:public Subject
{
public:
    std::list<Observer*> m_Observers;
    Msg m_Msg;
public:
    RealSubject()
    {};
    void registerObserver(Observer* o)
    {
        m_Observers.push_back(o);
    }
    void removeObserver(Observer* o)
    {
        m_Observers.remove(o);
    }
    void notifyObserver()
    {
        std::list<Observer*>::iterator it = m_Observers.begin();
        for(; it != m_Observers.end(); ++it )
        {
            (*it)->update(m_Msg);
        }
    }
};

class realObserver1:public Observer
{
public:
    realObserver1(RealSubject sbj)
    {
        //sbj.registerObserver(this);//不能在这里注册!!
    }
    void update(Msg m)
    {
        std::cout<<"realObserver1:"<<m.x<<std::endl;
    }
};

class realObserver2:public Observer
{
public:
    realObserver2(RealSubject sbj)
    {
        //sbj.registerObserver(this);
    }
    void update(Msg m)
    {
        std::cout<<"realObserver2:"<<m.x<<std::endl;
    }
};

int main(int argc, char const *argv[])
{
    RealSubject sbj;
    realObserver1* ob1 = new realObserver1(sbj);
    realObserver2* ob2 = new realObserver2(sbj);

    sbj.registerObserver(ob1);
    sbj.registerObserver(ob2);

    int n = 0;
    while(std::cin>> n && n != 0)
    {
        sbj.m_Msg.x = n;
        sbj.notifyObserver();  
    }

    return 0;
}

解析:

#####Subject为消息源,Observer为观察者,即消息接收者

#####可以看到,一旦Subject的信息有改动,就会调用 notifyObserver()这个函数(例子里为了简化,手动调的),用来通知所有的观察者。

#####观察者在update()里收到通知之后,就进行自己的操作。

#####之所以可以灵活增减观察者,是因为m_Observers这个list可以随意变动,而这个list又决定了哪些观察者可以接受消息。从而使Subject不会因为Observer数量增减而变动。

#####再来看Msg这个结构体,这个决定了所有中间传递的消息。所以说,发送和收到的数据是固定的。其实最终的原因还是Observer中update的参数固定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值