Xlua 消息管理器 消息机制 消息派发 分组消息 高新能消息管理

文章介绍了一个名为MessageDispatcher的类,该类用于管理消息监听器。它支持将多个消息归入同一组,当需要移除一组消息时,可以一次性移除整个组,而无需逐一删除。在派发消息时,MessageDispatcher会按照分组和消息名称来调用对应的回调函数。在测试中,创建并移除了不同分组的消息监听,然后进行了消息派发和更新操作。
摘要由CSDN通过智能技术生成

我在这里加了各个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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值