class Listener //监听者的基类
{
public:
Listener(string name):mName(name){}
virtual void handleMessage(int iMessage) const=0; //对感兴趣的事件进行处理
protected:
string mName;
};
class TestListener1:public Listener
{
public:
TestListener1(string name):Listener(name){}
void handleMessage(int message)const
{
switch(message)
{
case 0:
cout<<mName<<" 0 msg "<<endl;
break;
case 1:
cout<<mName<<" 1 msg "<<endl;
break;
default:
cout<<mName<<" unknown msg "<<endl;
}
}
};
class TestListener2:public Listener
{
public:
TestListener2(string name):Listener(name){}
void handleMessage(int message)const
{
switch(message)
{
case 0:
cout<<mName<<" 1 msg "<<endl;
break;
case 1:
cout<<mName<<" 2 msg "<<endl;
break;
default:
cout<<mName<<" unknown msg "<<endl;
}
}
};
class TestListener3:public Listener
{
public:
TestListener3(string name):Listener(name){}
void handleMessage(int message)const
{
switch(message)
{
case 0:
cout<<mName<<" 0 msg "<<endl;
break;
case 1:
cout<<mName<<" 3 msg "<<endl;
break;
default:
cout<<mName<<" unknown msg "<<endl;
}
}
};
class Observer //观察者
{
public:
typedef map<int,vector<const Listener*>> TYPE;
typedef pair<int,vector<const Listener*>> VALUE_TYPE;
/*注册消息,用map表将消息类型和对该消息感兴趣的监听者保存,因为对某一 消息感兴趣的监听者不止一个,所以将他们用一个vector保存,map表的键是消 息类型,值是保存监听者的vector*/
static void registerListener(int msg,const Listener * inLinster)
{
vector<const Listener*> tmpVec;
TYPE::iterator it = sListenerMap.find(msg);
if(it==sListenerMap.end())
{
tmpVec.push_back(inLinster);
sListenerMap.insert(VALUE_TYPE(msg,tmpVec));
}
else
{
it->second.push_back(inLinster);
}
}
static void dispatchMessage(int msg) //分发消息,
{
typedef vector<const Listener*> VEC_TYPE;
TYPE::iterator it = sListenerMap.find(msg);
if(it==sListenerMap.end())
{
return ;
}
VEC_TYPE::iterator vecit = it->second.begin();
for(;vecit!=it->second.end();++vecit)
{
(*vecit)->handleMessage(msg); //若找到该消息的监听者,调用他的处理 //消息的方法
}
}
protected:
static map<int,vector<const Listener*>> sListenerMap;
};
map<int,vector<const Listener*>> Observer::sListenerMap;
int main()
{
Observer obser;
Listener *p1 = new TestListener1("test1");
Listener *p2 = new TestListener2("test2");
Listener *p3 = new TestListener3("test3");
obser.registerListener(0, p1);
obser.registerListener(1, p1);
obser.registerListener(1, p2);
obser.registerListener(2, p2);
obser.registerListener(0, p3);
obser.registerListener(3, p3);
int msg;
while(true)
{
cout<<"msg:";
cin>>msg;
if(msg==-1)
{
break;
}
obser.dispatchMessage(msg);
}
return 0;
}
监听者—观察者模式
最新推荐文章于 2018-08-24 02:49:43 发布