1.什么是责任链模式?
将请求的发送者和接收者解耦,请求沿着一条链传递。
知道某个节点处理它,或者链走到头。
一句话理解:不关心谁能处理这件事,只把请求丢给链,谁能处理谁上。
2.实战演示:技能释放校验链
玩家点击技能按钮时,需要经过一系列校验:
需求场景:玩家点击节能按钮时,需要经过一系列校验:
1.是否被新手引导拦截
2.是否在cd中
3.是否有足够蓝量
4.是否被沉默Buff禁止
只要有一个不通过,就不能释放技能
(1)定义请求对象
public class SkillRequest
{
public int SkillId;
public bool IsGuideBlocked;
public bool IsCoolingDown;
public bool HasEnoughMana;
public bool IsSilenced;
}
(2)定义抽象责任节点
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)新手引导校验
public class GuideCheckHandler : SkillHandler
{
public override bool Handle(SkillRequest request)
{
if (request.IsGuideBlocked)
{
Debug.Log("技能被新手引导拦截");
return false;
}
return base.Handle(request);
}
}
(4)CD校验
public class CooldownCheckHandler : SkillHandler
{
public override bool Handle(SkillRequest request)
{
if (request.IsCoolingDown)
{
Debug.Log("技能冷却中");
return false;
}
return base.Handle(request);
}
}
(5)蓝量校验
public class ManaCheckHandler : SkillHandler
{
public override bool Handle(SkillRequest request)
{
if (!request.HasEnoughMana)
{
Debug.Log("蓝量不足");
return false;
}
return base.Handle(request);
}
}
(6)Buff校验
public class SilenceCheckHandler : SkillHandler
{
public override bool Handle(SkillRequest request)
{
if (request.IsSilenced)
{
Debug.Log("被沉默,无法释放技能");
return false;
}
return base.Handle(request);
}
}
(7)使用
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即可
符合开闭原则:不改旧代码,只增加新类
逻辑清晰:每个类只做一件事
网硕互联帮助中心



评论前必须登录!
注册