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

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

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

相关推荐
小程故事多_8014 小时前
从快速迭代到稳定存续,Google五大设计模式重构长效AI智能体落地逻辑
人工智能·设计模式·重构
码匠许师傅1 天前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
2401_868534781 天前
网规备考_2.4 路由协议
c++·设计模式
cpp_learner2 天前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
c++·设计模式
码匠许师傅2 天前
【设计模式精讲】23.备忘录模式(Memento)
c++·设计模式·软件工程·uml·备忘录模式
新知图书2 天前
第8章 多智能体协同
人工智能·设计模式·智能体
京师20万禁军教头2 天前
39面向对象(高级)-设计模式
java·开发语言·设计模式
新知图书3 天前
3.5 智能体设计模式1:反应式智能体与自动导航案例
人工智能·设计模式·智能体
码匠许师傅3 天前
【设计模式精讲】21.迭代器模式(Iterator)
c++·设计模式·rpc·迭代器模式·软件工程·uml
Carl_奕然4 天前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型