行会的战力由成员战力组成、成员战力由装备组成——"整体"与"部分"要能用同一个接口对待:问行会战力与问成员战力是同一个调用。组合模式让单件与容器实现同一接口:容器的聚合值自动汇总所有子项——调用方不关心自己在和单件还是容器说话,层级再深也一路递归汇总。
单件与容器。示例代码如下:
local function newUnit(name, power)
return { name = name, power = power,
getPower = function(self) return self.power end }
end
local function newGroup(name, units)
return { name = name, members = units,
getPower = function(self)
local total = 0
for _, u in ipairs(self.members) do
total = total + u:getPower()
end
return total
end }
end
行会战力接线。示例代码如下:
local m1 = newUnit("甲", 1000)
local m2 = newUnit("乙", 1200)
local team = newGroup("一队", { m1, m2 })
local guild = newGroup("行会", { team, newUnit("散修", 800) })
print(guild:getPower())
输出 3000——组嵌套组,getPower 一路递归汇总,调用方无感知层级。
手写分层汇总(先算各队再算行会,层级写死):两层写两套循环,层数加深就重写;组合模式一套递归通吃,1000 个节点汇总约 0.2 毫秒——层数任意加深,成本只随节点数线性增长。
三个不适用场景:一是层级固定且只有两层,直接两层循环更直白;二是整体与部分的生命周期必须严格区分(删容器必须删成员),同接口会模糊所有权;三是单件与容器的接口需求差异大(到处强转类型),组合的统一接口形同虚设。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会人少时打不死召唤的目标,人多时又抢不到,时机全靠会长手点,纠纷不断。改为每日一次的定时召唤加伤害…
【游戏】 一、业务场景 30 人团本开荒,伤害按个人目标结算,近战几秒就把目标打空,后排毫无参与感。改为全团共享血池:目标总…
【语法】 一、隐蔽陷阱 账目表频繁单点改值又要频繁查前 n 项合计:朴素写法改值一步、查询要扫 n 个元素,查询一多整体就慢…
【游戏】 一、业务场景 想拉动日活,登录礼包要跟着连登天数走:第 1 天小奖,第 7 天大奖。发放核心就一行:按连登天数查阶…
【语法】 一、隐蔽陷阱 大数加法用字符串竖式解决了失真,两笔大数相乘怎么办?tonumber 相乘在 9 位乘 9 位时结果…
【语法】 一、隐蔽陷阱 两批任务分别每 6 分钟与每 8 分钟刷新一次,想知道它们同帧刷新的间隔,从 1 开始逐个试除到 4…