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

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

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

相关推荐
workflower11 小时前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯13 小时前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则
安冬的码畜日常15 小时前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行
AI大法师1 天前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
晚安code1 天前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
workflower2 天前
从幻觉,到现实
人工智能·深度学习·机器学习·设计模式·机器人
电子科技圈2 天前
第二代无线平台历久弥新,赋能物联网创新迭代
人工智能·嵌入式硬件·mcu·物联网·设计模式·硬件架构·iot
choumin2 天前
创建型模式——工厂方法模式
c++·设计模式·工厂方法模式·创建型模式
choumin2 天前
创建型模式——原型模式
c++·设计模式·原型模式·创建型模式
37.2℃9952 天前
Claude Design哪个公司技术好
python·设计模式