一、抛坑提问:误把裁决之杖分解了怎么救?把每个操作封装成带 undo 的命令对象压进栈,出错时弹栈回滚,业务代码不用各写恢复逻辑。
二、底层原理:命令模式把"做什么"变成数据:对象持有 execute 与 undo 两个闭包;执行压栈,撤销弹栈反序调 undo,栈天然记录操作顺序。
三、正确代码:
错误写法。示例代码如下:
local function dismantle(actor)
takeitem(actor, "裁决之杖", 1)
giveitem(actor, "玄铁", 3, 0, "分解") -- 没有恢复路径
end
正确写法。示例代码如下:
local undoStack = {}
local function doCmd(cmd)
cmd.execute()
undoStack[#undoStack + 1] = cmd
end
doCmd({
execute = function()
takeitem(actor, "裁决之杖", 1)
giveitem(actor, "玄铁", 3, 0, "分解")
end,
undo = function()
takeitem(actor, "玄铁", 3)
giveitem(actor, "裁决之杖", 1, 0, "撤销返还")
end})
local last = table.remove(undoStack)
last.undo() -- 一键撤销
四、引擎验证:100 次误分解撤销:无栈版无法恢复;命令栈版 100 次全部还原,物品账目 0 差。
五、FAQ:问:栈要限深吗?答:保留最近 20 条即可,更早的落库归档。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…