在Unity开发中, 责任链模式(Chain of Responsibility Pattern) 用于让多个处理器按顺序组成”链条”, 请求沿着链条传递, 直到有一个处理器能处理该请求. 它的核心价值是解耦请求的发送者和接收者 ——— 发送者无需知道那个处理器会处理请求, 只需将请求交给链条即可; 同时支持动态增减处理器, 灵活性极高.
 

举个具体场景: 角色伤害处理流程

游戏中角色受到伤害时, 需要经过一系列”校验和处理”, 每个步骤独立且有优先级:
 
  1. 无敌校验: 如果角色处于无敌状态, 直接拦截伤害, 不往下传递;
  1. 护盾抵消: 如果角色有护盾, 用护盾值抵消部分 / 全部伤害, 剩余伤害继续传递;
  1. 闪避触发: 如果触发闪避概率, 拦截伤害, 不往下传递;
  1. 最终扣血: 所有校验通过后, 才扣除角色生命值.
 
如果用传统方式(嵌套 if-else ), 代码会臃肿且难以扩展(新增”伤害减免 buff”需要修改原有逻辑). 责任链模式可以让每个处理步骤成为独立的”处理器”, 按顺序组成链条, 请求自动流转.
 

责任链模式的核心角色

  1. 抽象处理器(Handler): 定义处理请求的接口, 包含”下一个处理器”的引用(链条的关键).
  1. 具体处理器(Concrete Handler): 实现抽象处理器, 判断自己是否能处理请求 ——— 能处理则处理, 不能则将请求传递给下一个处理器.
  1. 客户端(Client): 发起请求, 将请求交给链条的第一个处理器, 无需关心后续处理流程.
 

代码实现步骤

  1. 定义请求实体(伤害信息)
先封装伤害相关的信息(如伤害值\伤害类型), 作为请求在链条中传递:
 
  1. 定义抽象处理器(链条节点基类)
抽象处理器规定所有具体处理器的统一接口, 包含”下一个处理器”的引用
 
  1. 实现具体处理器(各伤害处理步骤)
每个具体处理器负责一个独立的逻辑, 判断是否能处理请求 不能则传递给下一个:
 
  1. 构建责任链(角色控制器)
用一个角色控制器管理所有处理器, 构建链条, 并提供对外的”受击”接口(客户端调用):
 
  1. 在Unity中配置与测试
    1. 创建角色: 新建一个空对象命名为 Player , 作为角色根节点.
    2. 添加处理器: 给 Player 添加4个具体处理器脚本(InvincibilityHandler \ ShieldHandler \ DodgeHandler \ HealthHandler ).
    3. 构建链条: 在 Inspector 中按优先级设置 _nextHandler :
        • InvincibilityHandler_nextHandler设为ShieldHandler
        • ShieldHandler_nextHandler设为DodgeHandler
        • DodgeHandler_nextHandler设为HealthHandler
        • HealthHandler_nextHandler留空(最后一环)。
    4. 添加角色控制器: 给 Player 添加 CharacterDamageSystem 脚本, 将 _firstHandler 设为 InvincibilityHandler .
    5. 测试代码: 新建一个测试脚本, 模拟攻击:
 

责任链模式的核心优势

  1. 解耦请求发送者和接收者: AttackTester (发送者) 只需调用 TakeDamage , 无需知道伤害是被无敌\护盾还是闪避处理的
  1. 灵活扩展: 新增”伤害减免 buff”时, 只需新增一个 DamageReductionHandler 脚本, 插入链条中(比如放在护盾后\闪避前), 无需修改原有处理器代码, 符合开放 - 封闭原则
  1. 动态调整链条: 运行时可修改链条顺序(如临时提升闪避优先级)或增减处理器(如移除护盾).
  1. 简化复杂逻辑: 用链条替代嵌套 if-else , 每个处理器指责单一(符合单一职责原则), 代码更易维护.
 

责任链模式的注意事项

  • 避免链条断裂: 确保每个处理器(除最后一个)都设置了 _nextHandler , 否则请求可能中途终止.
  • 控制链条长度: 链条过长会导致请求处理效率降低, 需合理拆分处理器.
  • 明确优先级: 处理的顺序直接影响处理结果, 需提前规划优先级(如无敌 > 护盾 > 闪避 > 扣血).
 

在 Unity 中的其他应用场景

  • UI 事件传递: 按钮点击事件沿UI层级链条传递(如子按钮未处理, 则传递给父面板)
  • 技能效果触发: 技能释放时, 按顺序触发”消耗法力 → 检查冷却 → 播放动画 → 造成伤害 → 触发被动”等处理器
  • 日志分级处理: 日志请求按”Debug → Info → Warn → Error” 链条传递, 不同级别日志由对应处理器输出(如 Error 日志同时写入文件和弹窗提示).
 
总结: 责任链模式就像”流水线作业” ——— 一个产品(请求)经过多个工序(处理器), 每个工序只做自己的事, 能处理就处理, 不能处理就传给下一个, 最终完成整个流程. 在 Unity 中, 它是处理”多步骤\可扩展”请求的”流程大师”.