Unity23种设计模式之 责任链模式

1.什么是责任链模式?

将请求的发送者和接收者解耦,请求沿着一条链传递。

知道某个节点处理它,或者链走到头。

一句话理解:不关心谁能处理这件事,只把请求丢给链,谁能处理谁上。

2.实战演示:技能释放校验链

玩家点击技能按钮时,需要经过一系列校验:

需求场景:玩家点击节能按钮时,需要经过一系列校验:

1.是否被新手引导拦截

2.是否在cd中

3.是否有足够蓝量

4.是否被沉默Buff禁止

只要有一个不通过,就不能释放技能

(1)定义请求对象

cs 复制代码
public class SkillRequest
{
    public int SkillId;
    public bool IsGuideBlocked;
    public bool IsCoolingDown;
    public bool HasEnoughMana;
    public bool IsSilenced;
}

(2)定义抽象责任节点

cs 复制代码
public abstract class SkillHandler
{
    protected SkillHandler _next;

    public void SetNext(SkillHandler next)
    {
        _next = next;
    }

    public virtual bool Handle(SkillRequest request)
    {
        if (_next != null)
            return _next.Handle(request);

        return true;
    }
}

(3)新手引导校验

cs 复制代码
public class GuideCheckHandler : SkillHandler
{
    public override bool Handle(SkillRequest request)
    {
        if (request.IsGuideBlocked)
        {
            Debug.Log("技能被新手引导拦截");
            return false;
        }

        return base.Handle(request);
    }
}

(4)CD校验

cs 复制代码
public class CooldownCheckHandler : SkillHandler
{
    public override bool Handle(SkillRequest request)
    {
        if (request.IsCoolingDown)
        {
            Debug.Log("技能冷却中");
            return false;
        }

        return base.Handle(request);
    }
}

(5)蓝量校验

cs 复制代码
public class ManaCheckHandler : SkillHandler
{
    public override bool Handle(SkillRequest request)
    {
        if (!request.HasEnoughMana)
        {
            Debug.Log("蓝量不足");
            return false;
        }

        return base.Handle(request);
    }
}

(6)Buff校验

cs 复制代码
public class SilenceCheckHandler : SkillHandler
{
    public override bool Handle(SkillRequest request)
    {
        if (request.IsSilenced)
        {
            Debug.Log("被沉默,无法释放技能");
            return false;
        }

        return base.Handle(request);
    }
}

(7)使用

cs 复制代码
SkillHandler guide = new GuideCheckHandler();
SkillHandler cd = new CooldownCheckHandler();
SkillHandler mana = new ManaCheckHandler();
SkillHandler silence = new SilenceCheckHandler();

guide.SetNext(cd);
cd.SetNext(mana);
mana.SetNext(silence);

bool canCast = guide.Handle(skillRequest);

if (canCast)
{
    Debug.Log("技能释放成功!");
}

顺序可随时调整

3.优点

解耦:请求发起者不关心具体处理逻辑

高拓展:增加一格校验,增加一格handler即可

符合开闭原则:不改旧代码,只增加新类

逻辑清晰:每个类只做一件事

相关推荐
Zane199415 小时前
同一段单例代码,为什么在高并发下偶尔会创建出两个实例?聊聊哪种单例实现才是真的安全
设计模式
Carl_奕然15 小时前
【智能体】Loop 的四种设计模式之:Agent Loop(2026 最新版)
人工智能·设计模式·语言模型
小酒星小杜16 小时前
画 AI 漫画,别只会写“日漫风”:10 种画风、适用故事和可复制提示词
人工智能·设计模式·程序员
sarasuki1 天前
为什么 Agent 工具需要一个「协议」而不是「框架」:MCP 成为标准的底层逻辑
设计模式·agent·mcp
vivo互联网技术1 天前
知识不是文件,也不是向量 | KDC 系列 02
人工智能·设计模式·架构
Zane19947 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫8 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19948 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19949 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..9 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot