码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-02 13:49:08      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   for   sp   数据   div   

//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 = 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模式实现)

标签:style   blog   io   color   os   for   sp   数据   div   

原文地址:http://www.cnblogs.com/sunbing/p/4069018.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!