一条业务请求(聊天、交易、入队)前面总挂着同样的横切逻辑:鉴权、限频、日志——每个入口各写一遍必然重复。中间件模式把横切逻辑做成可串接的层:请求像穿过洋葱一样依次经过每一层,进与出各执行一次(前半做前置校验、后半做收尾记录);任何一层返回 false,请求不再向内传播。层与层解耦,新增横切规则就是加一层。
链式组合器。示例代码如下:
local function compose(middlewares)
return function(ctx)
local function dispatch(i)
local mw = middlewares[i]
if not mw then
return true
end
return mw(ctx, function()
return dispatch(i + 1)
end)
end
return dispatch(1)
end
end
聊天链接线。示例代码如下:
local chain = compose({
function(ctx, next)
if ctx.muted then
return false
end
return next()
end,
function(ctx, next)
ctx.text = string.upper(ctx.text)
return next()
end,
function(ctx, next)
sendmsg(ctx.actor, 1, ctx.text)
return true
end
})
print(chain({ actor = actor, text = "沙巴克集结", muted = false }))
三层串成一条链:禁言层拦截、加工层变换、投递层执行——任一层返回 false,整链终止且内层不再触达。
硬编码入口零额外开销;三层中间件链一次请求多 3 次闭包调用,约 0.001 毫秒,可忽略。换来的是结构收益:新增一条横切规则从"改全部入口"变成"加一层",聊天相关入口从 6 个收敛到 1 个后,相关代码行数下降约 70%。
三个不适用场景:一是一两个入口的小脚本,顺序直写更直白;二是层间有严格顺序依赖却需要频繁调序的业务,洋葱模型的顺序约定反成负担;三是中间件里干重活(大表扫描、批量计算)——链条的耗时逐层叠加,中间件只应做轻量判断。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会人少时打不死召唤的目标,人多时又抢不到,时机全靠会长手点,纠纷不断。改为每日一次的定时召唤加伤害…
【游戏】 一、业务场景 30 人团本开荒,伤害按个人目标结算,近战几秒就把目标打空,后排毫无参与感。改为全团共享血池:目标总…
【语法】 一、隐蔽陷阱 账目表频繁单点改值又要频繁查前 n 项合计:朴素写法改值一步、查询要扫 n 个元素,查询一多整体就慢…
【游戏】 一、业务场景 想拉动日活,登录礼包要跟着连登天数走:第 1 天小奖,第 7 天大奖。发放核心就一行:按连登天数查阶…
【语法】 一、隐蔽陷阱 大数加法用字符串竖式解决了失真,两笔大数相乘怎么办?tonumber 相乘在 9 位乘 9 位时结果…
【语法】 一、隐蔽陷阱 两批任务分别每 6 分钟与每 8 分钟刷新一次,想知道它们同帧刷新的间隔,从 1 开始逐个试除到 4…