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. WPF数据模板中绑定事件不触发问题

    今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...

  2. JAVA泛型知识(二)--> <? extends T>和<? super T>

    <? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...

  3. IDF-CTF-简单的js加密 writeup

    题目链接: http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=43 知识点:js语法 这里这里→ http://c ...

  4. 通过Samba练习metasploit的使用

    文章学习利用metasploit通过Samba3.X获取metasploitable2的shell,从而去熟悉metasploit的使用. 环境: kali IP:192.168.137.133 me ...

  5. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)

    题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...

  6. [暑假集训Day2T2]走廊泼水节

    给定一棵n个点的图上的最小生成树,让你把它补成完全图,使得新图的MST还是给定的MST且边权和最小,输出需要增加的边权和. 设size[i]表示以i号为祖先的并查集的大小. 首先按边权排序,之后在做M ...

  7. vuex配置

    import Vue from 'vue' import App from './App.vue' import router from './router' import store from '. ...

  8. c语言开发浏览器插件

    c语言开发浏览器插件 senk????sec???

  9. C#基础知识之类和结构

    虽然项目中一直在使用类.结构体等类型,仔细琢磨,还真无法系统的说出个所以然.记录一下类.结构体.类和结构体区别 一.类 对于类,大家都特别熟悉.简单的介绍一下类的结构,然后记录一下Class需要注意的 ...

  10. 初识Uniprot API

    Uniprot,全名Universal Protein,其整合了Swissprot.TrEMBL和PRI-PSD三大数据库,是目前使用非常广泛的蛋白质数据库 常规物种的蛋白质组学研究一般会使用Unip ...