lua实现简单
MessageManager.lua
local messageManager = {mEventTable = {},mEventUserData = {}}
--注册事件
function messageManager.Add(EventName,Func,UserData)
assert( Func )
messageManager.mEventTable[ EventName ] = messageManager.mEventTable[ EventName ] or {}
local Event = messageManager.mEventTable[ EventName]
table.insert(Event,Func)
messageManager.mEventUserData[ EventName ] = messageManager.mEventUserData[ EventName ] or {}
local userDataTable = messageManager.mEventUserData[ EventName ]
userDataTable[ Func ] = UserData or true
end
--移除事件
function messageManager.Remove(EventName,Func)
assert( Func )
local Event = messageManager.mEventTable[ EventName ]
if not Event then
return
end
table.remove(Event)
end
--派发消息
function messageManager.Dispatch(EventName)
assert(EventName)
if (messageManager.mEventTable[EventName] == nil) then
return
end
local Event = messageManager.mEventTable[EventName]
for i,Func in ipairs(Event) do
Func(messageManager.mEventUserData[EventName][Func])
end
end
return messageManager
User.lua
--获取事件监听器
local MessageManager = require 'MessageManager'
--注册事件“a”
MessageManager.Add("a",function(a) print(a) end,"\"a\" happened!")
--事件“a”发生
MessageManager.Dispatch("a")
print("-------------------")
--移除事件“a”
MessageManager.Remove("a",function(a) print(a) end)
--事件“a”发生
MessageManager.Dispatch("a")
运行User.lua得到的结果:
可以看到注册事件“a”之后,当事件“a”发生之后,相对应的回调函数被事件监听器执行了;当移除事件“a之后”,事件“a”再次发生的时候,事件监听器并没有再执行事件监听者注册事件时留下的回调函数。
这次完成的事件监听器只是个简单的demo,还有很多地方没有完善的,比如同一个事件被多个事件监听者注册的情况以及同一个事件被同一个事件监听者注册的情况,还有回调函数的参数为可变长参数的情况。
这篇博客只是我自己在学习lua路上的一点学习记录,希望大家多多指教。
---------------------
最新文章
- angularjs 解决ng-repeat数组内重复对象报错的问题
- Matlab 语谱图(时频图)绘制与分析
- HDU 2831 (贪心)
- java集合练习——题目
- Tomcat服务器性能优化
- Softmax回归(使用theano)
- DEBUG模式下屏蔽某些烦人的动态日志信息
- 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
- hello,boke
- UVa 10617 Again Palindromes / 记忆化搜索
- php 序列化储存和转化 json_encode() json_decode($q,true)
- [Linux]使用Clang实现代码静态分析
- Linux 源码编译Python 3.6
- Centos制作本地yum源
- 用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST
- 快速掌握Nginx(二) —— Nginx的Location和Rewrite
- deep learning的一些知识点
- elf格式转换为hex格式文件的两种方法
- .NetCore 资料分享
- 网络编程之Socket详解