观察者模式也叫订阅-发布模式,显然适合处理一对多的消息发布问题。
以下代码定义了观察者抽象类,纯虚函数为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()
网友评论