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

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

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

相关推荐
Dabei4 小时前
Android 无障碍服务实现美团/微信自动化:客户端开发实践
前端·设计模式
巴沟旮旯儿6 小时前
vite项目配置文件和打包
前端·设计模式
雪度娃娃7 小时前
设计模式——单例模式
开发语言·c++·设计模式
逝水如流年轻往返染尘9 小时前
设计模式之单例模式
单例模式·设计模式
雪度娃娃1 天前
设计模式-UML
设计模式
kyriewen111 天前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
开发语言·前端·javascript·设计模式·ecmascript
geovindu2 天前
go: Mediator Pattern
设计模式·golang·中介者模式
kyriewen2 天前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
Pkmer2 天前
古法编程: 适配器模式
java·设计模式