使用Lua语言实现简单的事件系统,注册监听/ 移除监听/ 广播消息
核心代码
Event = {}
local events = {}
function Event.Trigger(eventname, ...)
local eventlist = events[eventname] or {}
for obj, callback in pairs(eventlist) do
if obj.OnEvent then
obj:OnEvent(eventname, ...)
end
end
end
function Event.Register(obj, eventname)
if not obj then
return error("Event.Register error: nil callback object", 2)
end
if not eventname then
return error("Event.Register error: nil event name", 2)
end
if type(eventname) == "string" then
local eventlist = events[eventname]
if not eventlist then
eventlist = {}
setmetatable(eventlist, {__mode="k"})
end
eventlist[obj] = true
events[eventname] = eventlist
end
return obj
end
function Event.Unregister(obj, eventname)
if not obj then
return error("Event.Unregister error: nil callback object", 2)
end
if not eventname then
return error("Event.Unregister error: nil event name", 2)
end
local eventlist = events[eventname]
if eventlist and eventlist[obj] then
eventlist[obj] = nil
end
end
return Event
Cat类
local Event = require "event_system"
local Cat = {}
Cat.__index = Cat
function Cat:ChaseMouse(mouse)
print(">>>>>>>>>The cat start CHASE the mouse", mouse)
end
function Cat:OnEvent(eventname, ...)
if eventname == "MOUSE_SPAWNED" and not self.chasing then
local mouse = ...
self:ChaseMouse(mouse)
end
end
Event.Register(Cat, "MOUSE_SPAWNED")
return Cat
Mouse类
local Mouse = {}
Mouse.__index = Mouse
function Mouse:initialize(x, y)
self:Spawn(x, y)
Event.Trigger("MOUSE_SPAWNED", self)
end
function Mouse:Spawn(x, y)
print("A mouse is spawn at (", x, y, ")")
end
return Mouse
Test_main
local Event = require "event_system"
local Mouse = require "Mouse"
local Cat = require "Cat"
Mouse:initialize(10, 20)
Event.Unregister(Cat, "MOUSE_SPAWNED")
Mouse:initialize(1, 1)
print("<<<<<< the cat now no longer chase the mouse")