美文网首页
设计模式-行为模式-观察者模式

设计模式-行为模式-观察者模式

作者: 阿棍儿_Leon | 来源:发表于2020-04-29 18:23 被阅读0次

观察者模式也叫订阅-发布模式,显然适合处理一对多的消息发布问题。

以下代码定义了观察者抽象类,纯虚函数为Receive,用来接收消息。

#include <iostream>
#include <list>

using namespace std;

class Observer
{
public:
    virtual ~Observer(){}
    virtual void Receive()=0;
protected:
    Observer(){}
};

以下代码定义了监听类,负责管理订阅者以及向所有订阅者发布消息。

class Listener
{
private:
    list<Observer*> m_observers;
public:
    virtual ~Listener(){}
    void attach(Observer* obsvr)
    {
        m_observers.push_back(obsvr);
    }
    void remove(Observer* obsvr)
    {
        m_observers.remove(obsvr);
    }
    void notify()
    {
        list<Observer*>::iterator iter = m_observers.begin();
        for (;iter != m_observers.end();iter++)
        {
            (*iter)->Receive();
        }
    }
};

以下代码定义了监听者子类,用户可以用它发布消息。

class MsgListener:public Listener
{
public:
    void Send()
    {
        notify();
    }
};

以下代码定义了观察者子类。

class MsgObserver:public Observer
{
public:
    void Receive()
    {
        cout<<__PRETTY_FUNCTION__<<endl;
    }
};

以下代码演示了观察者模式。
首先,创建监听者和观察者对象。
然后,观察者订阅监听者(调用attach),用户发布消息(调用notify)。
最后,观察者退订监听者(调用remove),用户再测试发布消息。

int main(void){
    Listener* listener = new MsgListener();
    Observer* observer = new MsgObserver();
    listener->attach(observer);
    listener->notify();
    listener->remove(observer);
    listener->notify();
    delete listener;
    delete observer;
    return 0;
}

输出只收看到发布的第一条消息。

virtual void MsgObserver::Receive()

相关文章

网友评论

      本文标题:设计模式-行为模式-观察者模式

      本文链接:https://www.haomeiwen.com/subject/pveiwhtx.html