监听者模式(listener)(c++实现)

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

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

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


  1. #include <iostream>    
  2. using namespace std;    
  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. int main(int argc, char* argv[])    
  63. {    
  64.     listenercenter listenercenter;    
  65.     statelistener statelis1;    
  66.     statelistener statelis2;    
  67.     listenercenter.addlistener(statelis1);    
  68.     listenercenter.addlistener(statelis2);    
  69.     cout<<"=========================="<<endl;    
  70.     listenercenter.firestatelistener(1);    
  71.     cout<<"=========================="<<endl;    
  72.     listenercenter.firestatelistener(2);    
  73.     cout<<"=========================="<<endl;    
  74.     listenercenter.firestatelistener(3);    
  75.     cout<<"=========================="<<endl;    
  76.     return 0;    
  77. }   

打印:

==========================
event 1 is fired.
event 1 is fired.
==========================
event 2 is fired.
event 2 is fired.
==========================
other event is fired.
other event is fired.
==========================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值