简单的事件回调机制
来源:互联网 发布:达梦数据库有限公司 编辑:程序博客网 时间:2024/06/11 17:35
简单的事件回调机制
用途:
以回调的形式处理事件,比如:处理按钮点解事件,处理登陆事件等
思路:
1、回调函数形式 std::function<void(Event* e)>
2、回调函数存储 std::unorder_map<std::string, std::function<void(Event* e)>
3、由EventDispatch统一管理所有的回调函数,并负责转发事件
4、所有事件派生自Event类,具体事件处理函数可以这样写:
void DoEvnet2(Event_2* e) {}
注册事件时:
[](Event* e) { Event_2* te = static_caset<Event_2*>(e); DoEvnet2(te);}
用途:
以回调的形式处理事件,比如:处理按钮点解事件,处理登陆事件等
思路:
1、回调函数形式 std::function<void(Event* e)>
2、回调函数存储 std::unorder_map<std::string, std::function<void(Event* e)>
3、由EventDispatch统一管理所有的回调函数,并负责转发事件
4、所有事件派生自Event类,具体事件处理函数可以这样写:
void DoEvnet2(Event_2* e) {}
注册事件时:
[](Event* e) { Event_2* te = static_caset<Event_2*>(e); DoEvnet2(te);}
定义各种事件参数
#ifndef __EVENT_H__#define __EVENT_H__class Event{public:int a;};class Event1 : public Event{public:int b;};#endif
#ifndef __EVENT_SYSTEM1_H__#define __EVENT_SYSTEM1_H__#include <string>#include <unordered_map>#include <functional>#include <list>#include "Event.h"using namespace std;class EventDispatch{public: typedef function < void(Event*)> cb;void registEvent(string id, cb _cb);void dispatch(string id, Event* e);protected:unordered_map<string, list<cb>> map_cb;};#endif
#include <algorithm>#include "../include/eventSystem1.h"void EventDispatch::registEvent(string id, cb _cb){auto& list = map_cb[id];list.push_back(_cb);}void EventDispatch::dispatch(string id, Event* e){auto _cb = map_cb.find(id);if (map_cb.end() != _cb){for_each(_cb->second.begin(), _cb->second.end(), [e](const cb& _cb) { _cb(e); });}}
测试代码:
#include "eventSystem1.h"#include <iostream>void onCb(Event* e){cout << "this is onCb " << e->a << endl;}void onCb2(Event1* e){cout << "this is onCb2" << e->b << endl;}static const string event1 = "EVENT1";static const string event2 = "EVENT2";int _tmain(int argc, _TCHAR* argv[]){EventDispatch dispatch;dispatch.registEvent(event1, onCb);dispatch.registEvent(event2, [](Event* e){Event1* e1 = static_cast<Event1*>(e);onCb2(e1);});Event e;Event1 e1;e.a = 1;e1.b = 20;dispatch.dispatch(event1, &e);dispatch.dispatch(event2, &e1);return 0;}
缺点:
1、无法实现撤销监听
2、当被监听对象析构后,无法及时撤销监听
3、无法监听统一类型的不同对象,如:无法分别监听两个按钮的点击事件,因为无法识别是哪一个按钮发出的事件。
0 0
- 简单的事件回调机制
- 简单的事件机制
- 事件机制的简单实例
- flash简单的事件机制
- 简单的事件分发机制
- 简单的事件通知机制实现
- 简单记录控件事件的分发机制
- Spring事件机制的简单例子
- 简单事件分发机制
- 基于回调机制的事件处理
- 基于安卓下的事件回调机制
- Android监听事件的回调机制
- 基于回调的事件处理机制
- 事件处理机制之基于回调的事件处理机制
- android View的点击事件分发机制的简单认知
- Android事件的分发、拦截、消费机制简单的流程
- 给对象增加一个简单的自定义事件机制
- 安卓触摸事件处理机制的简单介绍
- Cocos2d-x 3.0rc,又一种创建项目方式
- Hive+GenericUDF示例一
- 9.3 构造和析构的次序
- 滑雪 POJ 1088
- JAVA 学习日志 测试抽象类的程序,每天进步/退步一点点,变化很大哦,努力!
- 简单的事件回调机制
- 杭电ACM 1020 Encoding
- Hive+GenericUDF示例二
- Storm常见模式——分布式RPC
- 编写类String的构造/析构函数,赋值操作符
- Android学习--------实现增删改查数据库操作以及实现类似微信好友对话管理操作
- zTree实现清空选中的第一个节点的子节点
- Valid Palindrome
- operation