在Unity开发中, 责任链模式(Chain of Responsibility Pattern) 用于让多个处理器按顺序组成”链条”, 请求沿着链条传递, 直到有一个处理器能处理该请求. 它的核心价值是解耦请求的发送者和接收者 ——— 发送者无需知道那个处理器会处理请求, 只需将请求交给链条即可; 同时支持动态增减处理器, 灵活性极高.
举个具体场景: 角色伤害处理流程
游戏中角色受到伤害时, 需要经过一系列”校验和处理”, 每个步骤独立且有优先级:
- 无敌校验: 如果角色处于无敌状态, 直接拦截伤害, 不往下传递;
- 护盾抵消: 如果角色有护盾, 用护盾值抵消部分 / 全部伤害, 剩余伤害继续传递;
- 闪避触发: 如果触发闪避概率, 拦截伤害, 不往下传递;
- 最终扣血: 所有校验通过后, 才扣除角色生命值.
如果用传统方式(嵌套
if-else ), 代码会臃肿且难以扩展(新增”伤害减免 buff”需要修改原有逻辑). 责任链模式可以让每个处理步骤成为独立的”处理器”, 按顺序组成链条, 请求自动流转.责任链模式的核心角色
- 抽象处理器(Handler): 定义处理请求的接口, 包含”下一个处理器”的引用(链条的关键).
- 具体处理器(Concrete Handler): 实现抽象处理器, 判断自己是否能处理请求 ——— 能处理则处理, 不能则将请求传递给下一个处理器.
- 客户端(Client): 发起请求, 将请求交给链条的第一个处理器, 无需关心后续处理流程.
代码实现步骤
- 定义请求实体(伤害信息)
先封装伤害相关的信息(如伤害值\伤害类型), 作为请求在链条中传递:
- 定义抽象处理器(链条节点基类)
抽象处理器规定所有具体处理器的统一接口, 包含”下一个处理器”的引用
- 实现具体处理器(各伤害处理步骤)
每个具体处理器负责一个独立的逻辑, 判断是否能处理请求 不能则传递给下一个:
- 构建责任链(角色控制器)
用一个角色控制器管理所有处理器, 构建链条, 并提供对外的”受击”接口(客户端调用):
- 在Unity中配置与测试
- 创建角色: 新建一个空对象命名为
Player, 作为角色根节点. - 添加处理器: 给 Player 添加4个具体处理器脚本(
InvincibilityHandler\ShieldHandler\DodgeHandler\HealthHandler). - 构建链条: 在 Inspector 中按优先级设置
_nextHandler: InvincibilityHandler的_nextHandler设为ShieldHandler;ShieldHandler的_nextHandler设为DodgeHandler;DodgeHandler的_nextHandler设为HealthHandler;HealthHandler的_nextHandler留空(最后一环)。- 添加角色控制器: 给
Player添加CharacterDamageSystem脚本, 将_firstHandler设为InvincibilityHandler. - 测试代码: 新建一个测试脚本, 模拟攻击:
责任链模式的核心优势
- 解耦请求发送者和接收者:
AttackTester(发送者) 只需调用TakeDamage, 无需知道伤害是被无敌\护盾还是闪避处理的
- 灵活扩展: 新增”伤害减免 buff”时, 只需新增一个
DamageReductionHandler脚本, 插入链条中(比如放在护盾后\闪避前), 无需修改原有处理器代码, 符合开放 - 封闭原则
- 动态调整链条: 运行时可修改链条顺序(如临时提升闪避优先级)或增减处理器(如移除护盾).
- 简化复杂逻辑: 用链条替代嵌套
if-else, 每个处理器指责单一(符合单一职责原则), 代码更易维护.
责任链模式的注意事项
- 避免链条断裂: 确保每个处理器(除最后一个)都设置了
_nextHandler, 否则请求可能中途终止.
- 控制链条长度: 链条过长会导致请求处理效率降低, 需合理拆分处理器.
- 明确优先级: 处理的顺序直接影响处理结果, 需提前规划优先级(如无敌 > 护盾 > 闪避 > 扣血).
在 Unity 中的其他应用场景
- UI 事件传递: 按钮点击事件沿UI层级链条传递(如子按钮未处理, 则传递给父面板)
- 技能效果触发: 技能释放时, 按顺序触发”消耗法力 → 检查冷却 → 播放动画 → 造成伤害 → 触发被动”等处理器
- 日志分级处理: 日志请求按”Debug → Info → Warn → Error” 链条传递, 不同级别日志由对应处理器输出(如 Error 日志同时写入文件和弹窗提示).
总结: 责任链模式就像”流水线作业” ——— 一个产品(请求)经过多个工序(处理器), 每个工序只做自己的事, 能处理就处理, 不能处理就传给下一个, 最终完成整个流程. 在 Unity 中, 它是处理”多步骤\可扩展”请求的”流程大师”.