监听器模式

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

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

   监听器模式是观察者模式的一种实现,也可以说是一种特殊称呼,比"观察者"更直观易理解.

#include <iostream>
#include <list>
using namespace std;

class IListener
{
public:
    IListener(){};
    virtual ~IListener(){};
    
    virtual void ActionPerformed(int state) = 0;
};

//Listener实现类(它类似于操作系统中的进程)
class StateListener : public IListener
{
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:
    list<IListener*> m_lstListener;
    
public:
    ListenerCenter(){};
    virtual ~ListenerCenter(){};
    
    int GetCount();
    
    void AddListener(IListener* listener);//如果用SetListener,则相当于桥模式
    void DeleteListener(IListener* listener);
    
    void Fire(int state);
};

int ListenerCenter::GetCount()
{
    return (int)m_lstListener.size();
}

void ListenerCenter::AddListener(IListener* listener)
{
    m_lstListener.push_back(listener);
}

void ListenerCenter::DeleteListener(IListener *listener)
{
    m_lstListener.remove(listener);
}

void ListenerCenter::Fire(int state)
{
    for(list<IListener*>::iterator iter = m_lstListener.begin(); iter != m_lstListener.end(); ++iter)
    {
        (*iter)->ActionPerformed(state);
    }
}

int main(int argc, char* argv[])
{
    ListenerCenter listenerCenter;
    IListener* lis1 = new StateListener;
    IListener* lis2 = new StateListener;
    listenerCenter.AddListener(lis1);
    listenerCenter.AddListener(lis2);
    listenerCenter.Fire(1);
    listenerCenter.Fire(2);
    listenerCenter.Fire(3);
    
    delete lis1;
    delete lis2;
    
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值