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

lua实现简单的更多相关文章

  1. nginx+lua实现简单的waf网页防火墙功能

    原文:http://www.2cto.com/net/201608/534272.html 安装LuaJIT http://luajit.org/download/LuaJIT-2.0.4.tar.g ...

  2. LUA GC 简单测试

    function table.count(t) if type(t) ~= "table" then assert(false) return end for k, _ in pa ...

  3. Lua:简单入门

    首先,感谢 runoob.com:http://www.runoob.com/lua/lua-tutorial.html 直接用 SciTE 进行文本编辑,F5调试,非常方便. 注意点: 1. 变量的 ...

  4. nginx+lua构建简单waf网页防火墙

    需求背景 类似于论坛型的网站经常会被黑掉,除了增加硬件防护感觉效果还是不太好,还会偶尔被黑,waf的功能正好实现了这个需求. waf的作用: 防止sql注入,本地包含,部分溢出,fuzzing测试,x ...

  5. lua元表(简单例子)

    Set = {} Set.mt = {}--定义普通的表作为元表,为了避免命名污染直接放在Set内部 function Set.new(t) local set = {} setmetatable(s ...

  6. Lua实现简单的类,继承,多态 实例

    -- 类的例子,长方形的类,具备一个打印面积方法和一个设置长宽的方法 --lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体 ...

  7. cocos2D-X LUA 非常简单的一个贪吃蛇案例

    --[[ 贪吃蛇 ]] local RetroSnaker = class("RetroSnaker", function() return cc.Layer:create(); ...

  8. CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

    1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...

  9. [原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子

    参考:https://eliasdaler.wordpress.com/tag/luabridge/ https://eliasdaler.wordpress.com/2015/08/10/using ...

随机推荐

  1. WCF权限认证多种方式

    WCF身份验证一般常见的方式有:自定义用户名及密码验证.X509证书验证.ASP.NET成员资格(membership)验证.SOAP Header验证.Windows集成验证.WCF身份验证服务(A ...

  2. Entity Framework 中遇到的一些小问题

    一.在多表关联中,一个表中有另一个表的model累,在Include方法里提示lambda表达式不是委托类型,这时候需要using System.Data.Entity; 二.插入数据时,主键并非自增 ...

  3. spring容器的启动过程

    spring的启动过程: 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环 ...

  4. vue-router 路由元信息 终于搞明白了路由元信息是个啥了

    vue-router 路由元信息:https://blog.csdn.net/wenyun_kang/article/details/70987840 终于搞明白了路由元信息是个啥了:https:// ...

  5. kmp(最长前缀与后缀)

    http://acm.hdu.edu.cn/showproblem.php?pid=1358 Period Problem Description For each prefix of a given ...

  6. 小B的询问(题解)(莫队)

    小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...

  7. 【java】jstack分析查看线程状态

    演示代码 public class StackTest { public static void main(String[] args) { Thread thread = new Thread(ne ...

  8. CSS 实现水平垂直居中

    使用绝对定位 在已经知道子元素的宽高的时候,子元素设置成绝对定位,top,left,right,bottom=0, margin = auto .wrap{ position: relative; w ...

  9. 【学习总结】gcc和gdb

    目录 <> vim.gcc.gdb: gcc: gcc和g++是c/c++的linux系统集成的编译器,源文件的后缀应为 .C/.cpp/.c++/.cc等 编译器可以将C.C++等语言源 ...

  10. ASE Alpha Sprint - backend scrum 10

    本次scrum于2019.11.15在sky garden进行,持续30分钟 参与人: Xin Kang, Zhikai Chen, Jia Ning, Hao Wang 请假: Lihao Ran, ...