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路上的一点学习记录,希望大家多多指教。
---------------------

最新文章

  1. angularjs 解决ng-repeat数组内重复对象报错的问题
  2. Matlab 语谱图(时频图)绘制与分析
  3. HDU 2831 (贪心)
  4. java集合练习——题目
  5. Tomcat服务器性能优化
  6. Softmax回归(使用theano)
  7. DEBUG模式下屏蔽某些烦人的动态日志信息
  8. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍
  9. hello,boke
  10. UVa 10617 Again Palindromes / 记忆化搜索
  11. php 序列化储存和转化 json_encode() json_decode($q,true)
  12. [Linux]使用Clang实现代码静态分析
  13. Linux 源码编译Python 3.6
  14. Centos制作本地yum源
  15. 用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST
  16. 快速掌握Nginx(二) —— Nginx的Location和Rewrite
  17. deep learning的一些知识点
  18. elf格式转换为hex格式文件的两种方法
  19. .NetCore 资料分享
  20. 网络编程之Socket详解

热门文章

  1. MySQL 对比数据库的表结构
  2. HTML --JS 密码验证
  3. C++ STL:优先队列的使用详解
  4. 如何通过xmake进行交叉编译
  5. Communications link failure mysql自动停止 连接拒绝 mysqld dead but sub。。。
  6. nodejs启动
  7. 在Eclipse的kepler中执行OSGIproject出错的解决方式
  8. emit写了个实体转换程序
  9. chrome浏览器canvas画图不显示
  10. [三下五除二]在Eclipse上的JFinal_Demo