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

---------------------