首页 > 代码库 > 实现一个简单的事件订阅通知机制(Observer模式实现)

实现一个简单的事件订阅通知机制(Observer模式实现)

//Base_Event.h#pragma once#include <list>enum Event_Type //事件类型{    NET_REFRESH, //网络环境改变事件    MSG_REFRESH, //消息改变事件    UI_REFRESH,  //UI界面更新事件    MAX_EVENT_LENGTH //事件种类长度};//事件处理接口,订阅该事件的类应该继承该接口,并实现HandleEvent()方法对事件进行处理class IEvent{public:    virtual void HandleEvent() = 0;};class EventDispatcher{public:    explicit EventDispatcher();    ~EventDispatcher();    void AddListener(Event_Type,IEvent *);                    //订阅事件    void RemoverListener(Event_Type,IEvent *);                //取消订阅事件    void DispatchEvent(Event_Type ,void *) const;            //分发事件并调用订阅该事件的所有对象处理该事件    static EventDispatcher& getInstance();                    //单例模式,实现对象单一化    static void *m_EventData ;                                //事件附加数据private:     std::list<IEvent*> m_EventsList[MAX_EVENT_LENGTH];        //事件对象存储链表};
//Base_Event.cpp#include "Base_Event.h"#include <assert.h>void * EventDispatcher::m_EventData =http://www.mamicode.com/ NULL;EventDispatcher::EventDispatcher(){        }EventDispatcher::~EventDispatcher(){}EventDispatcher& EventDispatcher::getInstance(){    static EventDispatcher singleEntity;    return singleEntity;}void EventDispatcher::AddListener(Event_Type et, IEvent *pEv){    assert(et < MAX_EVENT_LENGTH);    m_EventsList[et].push_back(pEv);}void EventDispatcher::RemoverListener(Event_Type et,IEvent *pEv){    assert(et < MAX_EVENT_LENGTH);    std::list<IEvent *>::iterator itor = std::find(m_EventsList[et].begin(), m_EventsList[et].end(), pEv);    if (itor != m_EventsList[et].end())    {        m_EventsList[et].erase(itor);    }    }void EventDispatcher::DispatchEvent(Event_Type et,void *pData)const{    for (std::list<IEvent *>::const_iterator itor = m_EventsList[et].begin(); itor != m_EventsList[et].end(); itor++)    {        (*itor)->HandleEvent(); //遍历该事件链表,并调用订阅该事件所有对象处理方法    }}
//main.cpp#include <iostream>#include "Base_Event.h"//Window1 可以用来模拟当后台数据发生变化,通知与该数据关联的所有窗口同步刷新处理该事件class Window1 :public IEvent{public :    Window1()    {        //订阅UI_REFRESH事件        EventDispatcher::getInstance().AddListener(UI_REFRESH, this);    }    ~Window1()    {        //取消订阅UI_REFRESH事件        EventDispatcher::getInstance().RemoverListener(UI_REFRESH, this);    }    //实现IEvent接口,并实现对UI_REFRESH消息的处理    virtual void HandleEvent()     {        std::cout << "hello ,i am window1 and i got the UI_REFRESH event\n";    }};int main(){    Window1 win1;    EventDispatcher::getInstance().DispatchEvent(UI_REFRESH, NULL); //分发UI_REFRESH事件    return 0;}

 

实现一个简单的事件订阅通知机制(Observer模式实现)