一条"发起攻城"的指令背后要动五个子系统:校验资格、扣报名费、生成战旗、广播预告、开启报名名单——调用方要依次调五个接口、记五种顺序。外观模式在最前面放一扇门面:一个函数把五步内部编排好,调用方只调这一个函数——子系统照旧复杂,门面让它们看起来是一个按钮。
门面编排。示例代码如下:
local Siege = {}
function Siege.launch(actor, guildName)
if not Siege.check(actor) then
return false
end
Siege.charge(guildName)
Siege.makeFlag(guildName)
Siege.broadcast(guildName)
Siege.openRoster(guildName)
sendmsg(actor, 1, "攻城申请完成。")
return true
end
子步骤示例。示例代码如下:
function Siege.check(actor)
local lv = tonumber(getplayvar(actor, 0, "Level")) or 0
return lv >= 50
end
function Siege.charge(guildName)
setsysvarex("SiegeFund_" .. guildName,
(tonumber(getsysvar("SiegeFund_" .. guildName)) or 0) + 100000, 1)
end
launch 把校验、扣费等五个子步骤串成一条指令——调用方一行完成,子步骤内部随意演进。
门面只是一层函数转发,单次调用额外开销纳秒级;收益在调用侧:五个接口的直接调用写法约 25 行且顺序易错,门面调用一行——调用侧代码量降 80%,顺序错误这类事故随门面归零。
三个不适用场景:一是调用方本来就需要精细控制每个子步骤(分步确认类业务),门面的一键封装反而挡路;二是子步骤组合方式频繁变化,每变一次都要改门面签名;三是子系统只有一两个,门面是纯粹的转发层,直接调用即可。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 打印 5 层星号金字塔,每层比上层多 2 颗星、左侧空格少 1 个——空格与星数的数量关系不清晰时,…
【游戏】 一、业务场景 帮会下午没活动,成员上线点个卯就走。狩猎场上线:每晚 8 点开门 30 分钟,场内刷固定猎物,猎杀计…
【游戏】 一、业务场景 帮战开打才发现帮会没有物资储备,临时收捐谁也不交。粮仓上线:平日捐粮入库记账,帮战期间按配给开仓领补…
【语法】 一、隐蔽陷阱 验证"任一整数的立方都能写成连续奇数之和"时,起点从 1 开始逐个试,n 稍大就长跑几百步还没对上—…
【游戏】 一、业务场景 帮会大厅一面空墙,有人提议留言,结果聊天区刷屏根本留不住。题字墙上线:花 100 帮贡刻一句题字永久…
【游戏】 一、业务场景 灯谜活动上线半小时谜底被解题工具全数搜出——谜面与谜底同放在一份客户端配置里,读表即得。服务端重构:…