组队频道里玩家、邮件、公告互相直接通信,连接数随参与方数量平方增长(n 方两两直连是 n 乘 n-1 除 2 条线)——改一方牵动全体。中介者模式在中央设一个枢纽:所有参与方只与中介者通信,由中介者分发——连接数从平方级降到线性,参与方彼此解耦,新增一方只接枢纽一处。
订阅与发布。示例代码如下:
local Hub = { listeners = {} }
local function subscribe(event, fn)
Hub.listeners[event] = Hub.listeners[event] or {}
Hub.listeners[event][#Hub.listeners[event] + 1] = fn
end
local function publish(event, payload)
local fns = Hub.listeners[event]
if not fns then
return
end
for _, fn in ipairs(fns) do
fn(payload)
end
end
击杀事件接线。示例代码如下:
subscribe("击杀", function(p) print("榜单: " .. p.name) end)
subscribe("击杀", function(p) print("公告: " .. p.name) end)
publish("击杀", { name = "裁决持有者" })
一个 publish,榜单与公告两个订阅者各自响应——两模块互不知晓对方存在。
点对点直连:5 个参与方 10 条连接,新增第 6 方要改 5 处;中介者 5 条连接,新增第 6 方只注册 1 次。代价:每条消息多一次中枢分发(哈希查找加遍历,微秒级);每秒百条消息的分发成本约 0.1 毫秒,可忽略。
三个不适用场景:一是参与方只有两三个且关系稳定,直连更直白;二是事件量巨大且订阅者众多(每秒万级事件),中枢遍历成为瓶颈,需按事件分片;三是消息需要点对点私密传递(不走广播),中介者的广播语义不匹配。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 打印 5 层星号金字塔,每层比上层多 2 颗星、左侧空格少 1 个——空格与星数的数量关系不清晰时,…
【游戏】 一、业务场景 帮会下午没活动,成员上线点个卯就走。狩猎场上线:每晚 8 点开门 30 分钟,场内刷固定猎物,猎杀计…
【游戏】 一、业务场景 帮战开打才发现帮会没有物资储备,临时收捐谁也不交。粮仓上线:平日捐粮入库记账,帮战期间按配给开仓领补…
【语法】 一、隐蔽陷阱 验证"任一整数的立方都能写成连续奇数之和"时,起点从 1 开始逐个试,n 稍大就长跑几百步还没对上—…
【游戏】 一、业务场景 帮会大厅一面空墙,有人提议留言,结果聊天区刷屏根本留不住。题字墙上线:花 100 帮贡刻一句题字永久…
【游戏】 一、业务场景 灯谜活动上线半小时谜底被解题工具全数搜出——谜面与谜底同放在一份客户端配置里,读表即得。服务端重构:…