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即可

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

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

相关推荐
Doris_202313 小时前
代码格式化 使用oxfmt
设计模式·架构·前端框架
Doris_202313 小时前
说一说ESLint+Prettier生效的原理
前端·设计模式·架构
Pomelooooo14 小时前
把 git commit 这件事,彻底交给 AI ——一个工程化 /git-commit 命令的设计与落地
设计模式
invicinble15 小时前
设计模式(类的拓扑结构)(描述总纲)
设计模式·原型模式
invicinble18 小时前
设计模式(类的拓扑结构)(为什么会产生设计模式,以及什么是设计模式)
linux·服务器·设计模式
PersonalViolet20 小时前
模板方法模式实战:重构Agent工具审批,告别重复代码
设计模式·agent
老码观察20 小时前
设计模式实战解读(五):策略模式——干掉 if-else 的优雅方案
java·设计模式·策略模式
解决问题no解决代码问题21 小时前
设计模式分类介绍
java·开发语言·设计模式
烬羽21 小时前
从 Python List 到 LLM 接口:一条被忽视的 AI 入门捷径
设计模式
我爱cope1 天前
【Agent智能体8 | 反思设计模式-大语言模型反思机制的四个演进阶段】
人工智能·设计模式·语言模型