#include <string>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
class Listener
{
public:
Listener(string name) :mname(name){}
virtual void handlemsg(int msgid) = 0;
protected:
string mname;
};
class Listener1 : public Listener
{
public:
Listener1(string name) :Listener(name){}
void handlemsg(int msgid)
{
cout << mname << " ";
switch (msgid)
{
case 0:
cout << "recv 0 msg" << endl;
break;
case 1:
cout << "recv 1 msg" << endl;
break;
default:
cout << "recv invalid msg!" << endl;
}
}
};
class Listener2 : public Listener
{
public:
Listener2(string name) :Listener(name){}
void handlemsg(int msgid)
{
cout << mname << " ";
switch (msgid)
{
case 1:
cout << "recv 1 msg" << endl;
break;
case 2:
cout << "recv 2 msg" << endl;
break;
default:
cout << "recv invalid msg!" << endl;
}
}
};
class Listener3 : public Listener
{
public:
Listener3(string name) :Listener(name){}
void handlemsg(int msgid)
{
cout << mname << " ";
switch (msgid)
{
case 2:
cout << "recv 2 msg" << endl;
break;
case 3:
cout << "recv 3 msg" << endl;
break;
default:
cout << "recv invalid msg!" << endl;
}
}
};
class Observer
{
public:
typedef map<int, vector<Listener*>> MAP;
typedef pair<int, vector<Listener*>> PAIR;
void registermsg(int msgid, Listener *listener)
{
MAP::iterator it = mListenerMap.find(msgid);
if (it == mListenerMap.end())
{
vector<Listener*> tmpvec;
tmpvec.push_back(listener);
mListenerMap.insert(PAIR(msgid, tmpvec));
}
else
{
it->second.push_back(listener);
}
}
void dispatchmsg(int msgid)
{
MAP::iterator it = mListenerMap.find(msgid);
if (it == mListenerMap.end())
{
throw "";
}
for (vector<Listener*>::iterator vit = it->second.begin();
vit != it->second.end(); ++vit)
{
(*vit)->handlemsg(msgid);
}
}
private:
map<int, vector<Listener*>> mListenerMap;
};
int main()
{
Observer obser;
Listener *p1 = new Listener1("Listener1");
Listener *p2 = new Listener2("Listener2");
Listener *p3 = new Listener3("Listener3");
obser.registermsg(0, p1);
obser.registermsg(1, p1);
obser.registermsg(1, p2);
obser.registermsg(2, p2);
obser.registermsg(2, p3);
obser.registermsg(3, p3);
int msgid = 0;
while (true)
{
cout << "msg id:";
cin >> msgid;
if (msgid == -1)
break;
obser.dispatchmsg(msgid);
}
return 0;
}
基本过程,注册监听者感兴趣的信号,当信号到来时,利用回调函数(多态原理),通知对该事件感兴趣的listen
监听者模式
最新推荐文章于 2024-03-13 19:43:11 发布