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

本文介绍了一种基于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. }   
    #include <iostream>  
    using namespace std;  
    //listener基类(抽象类)  
    class abstractlistener  
    {  
    	public:  
    	abstractlistener(){};  
    	virtual ~abstractlistener(){};  
    	virtual void actionperformed(int state) = 0;  
    };  
    //listener实现类(它类似于操作系统中的进程)  
    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;  
    	}  
    }  
    //listener center(类似于操作系统(os))  
    class listenercenter  
    {  
    	private:  
    	statelistener listenerlist[50];//存储listener的数组  
    	int count;//当前中心中已有的listener的个数  
    	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.
    ==========================

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值