我在这里加了各个Group的概念,作用就是 比如 我以一个UI界面监听了很多个消息,那么我可以把这些消息放在一个Group里面,关闭这个UI时,移除这个消息Group就可以了,而不必逐个移除
-- 消息派发类 MessageDispatcher
local MessageDispatcher = class("MessageDispatcher")
function MessageDispatcher:ctor()
self.listeners = {} -- 监听器列表
end
-- 添加监听器
-- @param group 消息分组
-- @param message 消息名称
-- @param callback 回调函数
function MessageDispatcher:addListener(group, message, callback)
if not self.listeners[group] then
self.listeners[group] = {}
end
if not self.listeners[group][message] then
self.listeners[group][message] = {}
end
table.insert(self.listeners[group][message], callback)
end
-- 移除一个分组的全部消息监听
-- @param group 消息分组
function MessageDispatcher:removeListenersByGroup(group)
self.listeners[group] = nil
end
-- 派发消息
-- @param group 消息分组
-- @param message 消息名称
-- @param ... 消息参数
function MessageDispatcher:dispatch(group, message, ...)
local listeners = self.listeners[group] and self.listeners[group][message]
if listeners then
for i = #listeners, 1, -1 do
local callback = listeners[i]
if callback then
callback(...)
end
end
end
end
-- Update 驱动消息派发
-- @param dt 时间间隔
function MessageDispatcher:Update(dt)
-- 遍历所有监听器,依次调用
for group, messages in pairs(self.listeners) do
for message, listeners in pairs(messages) do
for i = #listeners, 1, -1 do
local callback = listeners[i]
if callback then
callback(dt)
end
end
end
end
end
-- 测试
local dispatcher = MessageDispatcher.new()
-- 添加监听器
dispatcher:addListener("group1", "msg1", function(...)
print("group1: msg1", ...)
end)
dispatcher:addListener("group1", "msg2", function(...)
print("group1: msg2", ...)
end)
dispatcher:addListener("group2", "msg1", function(...)
print("group2: msg1", ...)
end)
-- 移除一个分组的全部消息监听
dispatcher:removeListenersByGroup("group1")
-- 派发消息
dispatcher:dispatch("group1", "msg1", "Hello")
dispatcher:dispatch("group2", "msg1", "World")
-- Update 驱动消息派发
dispatcher:Update(0.1)