监听者对大家来说可能并不陌生,所谓监听者就是用来监听自已感兴趣的事件的,当收到自已感兴趣的事件时会做出相应的反映。
它的应用是非常广的,比如win32的消息机制,它跟监听者模式就异曲同工,操作系统将产生的各种事件包装成消息(MSG),该消息结构包装了发生的事件的描述信息,比如消息值,屏幕坐标等,然后将它投递到相应的进程中,当该进程收到该消息时会查看该MSG结构中的信息,也就知道了发生了什么事件,并对自已感兴趣的事件进行响应。
下面我们就来用C++实现一个简单的监听者
#include <iostream>
- using namespace std;
-
-
- class AbstractListener
- {
- public:
- AbstractListener(){};
- virtual ~AbstractListener(){};
- virtual void ActionPerformed(int state) = 0;
- };
-
- class StateListener:public AbstractListener
- {
- public:
- StateListener(){};
- virtual ~StateListener(){};
- virtual void ActionPerformed(int state);
- };
- void StateListener::ActionPerformed(int state)
- {
-
- if(state==1){
- cout<<"event 1 is fired."<<endl;
- }else if(state==2){
- cout<<"event 2 is fired."<<endl;
- }else{
- cout<<"other event is fired."<<endl;
- }
- }
-
- class ListenerCenter
- {
- private:
- StateListener listenerList[50];
- int count;
- public:
- ListenerCenter();
- virtual ~ListenerCenter(){};
- int GetCount();
- void AddListener(StateListener);
- void FireStateListener(int state);
- };
- ListenerCenter::ListenerCenter()
- {
- this->count=0;
- }
- int ListenerCenter::GetCount()
- {
- return count;
- }
- void ListenerCenter::AddListener(StateListener statelistener)
- {
- listenerList[this->count]=statelistener;
- this->count++;
- }
- void ListenerCenter::FireStateListener(int state)
- {
- for(int i=0;i<this->count;i++){
- listenerList[i].ActionPerformed(state);
- }
- }
-
- int main(int argc, char* argv[])
- {
- ListenerCenter listenerCenter;
-
- StateListener statelis1;
- StateListener statelis2;
-
- listenerCenter.AddListener(statelis1);
- listenerCenter.AddListener(statelis2);
-
- cout<<"=========================="<<endl;
- listenerCenter.FireStateListener(1);
- cout<<"=========================="<<endl;
- listenerCenter.FireStateListener(2);
- cout<<"=========================="<<endl;
- listenerCenter.FireStateListener(3);
- cout<<"=========================="<<endl;
-
- return 0;
- }
输出结果:
========================== event 1 is fired. event 1 is fired. ========================== event 2 is fired. event 2 is fired. ========================== other event is fired. other event is fired. ==========================
该模式的应用非常广,比较经典的应用是AWT的事件处理机制,如果应用得当,会使程序的可读性变得很好。
|