分享

监听者

 learnandup 2012-03-08
     监听者对大家来说可能并不陌生,所谓监听者就是用来监听自已感兴趣的事件的,当收到自已感兴趣的事件时会做出相应的反映。

    它的应用是非常广的,比如win32的消息机制,它跟监听者模式就异曲同工,操作系统将产生的各种事件包装成消息(MSG),该消息结构包装了发生的事件的描述信息,比如消息值,屏幕坐标等,然后将它投递到相应的进程中,当该进程收到该消息时会查看该MSG结构中的信息,也就知道了发生了什么事件,并对自已感兴趣的事件进行响应。

    下面我们就来用C++实现一个简单的监听者

   #include <iostream>   
  1. using namespace std;  
  2.   
  3. //Listener基类(抽象类)   
  4. class AbstractListener  
  5. {  
  6. public:  
  7.     AbstractListener(){};  
  8.     virtual ~AbstractListener(){};  
  9.     virtual void ActionPerformed(int state) = 0;  
  10. };  
  11. //Listener实现类(它类似于操作系统中的进程)   
  12. class StateListener:public AbstractListener  
  13. {  
  14. public:  
  15.     StateListener(){};  
  16.     virtual ~StateListener(){};  
  17.     virtual void ActionPerformed(int state);  
  18. };  
  19. void StateListener::ActionPerformed(int state)  
  20. {          
  21.          //这里就是对自已感兴趣的事件的相应处理   
  22.     if(state==1){  
  23.         cout<<"event 1 is fired."<<endl;  
  24.     }else if(state==2){  
  25.         cout<<"event 2 is fired."<<endl;  
  26.     }else{  
  27.         cout<<"other event is fired."<<endl;  
  28.     }  
  29. }  
  30. //Listener Center(类似于操作系统(OS))   
  31. class ListenerCenter  
  32. {  
  33. private:  
  34.     StateListener listenerList[50];//存储listener的数组   
  35.     int count;//当前中心中已有的listener的个数   
  36. public:  
  37.     ListenerCenter();  
  38.     virtual ~ListenerCenter(){};  
  39.     int GetCount();  
  40.     void AddListener(StateListener);  
  41.     void FireStateListener(int state);  
  42. };  
  43. ListenerCenter::ListenerCenter()  
  44. {  
  45.     this->count=0;  
  46. }  
  47. int ListenerCenter::GetCount()  
  48. {  
  49.     return count;  
  50. }  
  51. void ListenerCenter::AddListener(StateListener statelistener)  
  52. {  
  53.     listenerList[this->count]=statelistener;  
  54.     this->count++;  
  55. }  
  56. void ListenerCenter::FireStateListener(int state)  
  57. {  
  58.     for(int i=0;i<this->count;i++){  
  59.         listenerList[i].ActionPerformed(state);  
  60.     }  
  61. }  
  62.   
  63. int main(int argc, char* argv[])  
  64. {  
  65.     ListenerCenter listenerCenter;  
  66.   
  67.     StateListener statelis1;  
  68.     StateListener statelis2;  
  69.   
  70.     listenerCenter.AddListener(statelis1);  
  71.     listenerCenter.AddListener(statelis2);  
  72.   
  73.     cout<<"=========================="<<endl;  
  74.     listenerCenter.FireStateListener(1);  
  75.     cout<<"=========================="<<endl;  
  76.     listenerCenter.FireStateListener(2);  
  77.     cout<<"=========================="<<endl;  
  78.     listenerCenter.FireStateListener(3);  
  79.     cout<<"=========================="<<endl;  
  80.   
  81.     return 0;  
  82. }  

输出结果:

 ==========================
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的事件处理机制,如果应用得当,会使程序的可读性变得很好。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多