当前位置:网站首页>责任链模式 - Unity
责任链模式 - Unity
2022-07-07 15:38:00 【有趣就行】
责任链模式
责任链模式是对象行为型模式,该模式中请求者发送的请求需要沿着处理者链进行传递,并被处理者处理,这样可以避免请求发送者与多个处理者耦合。
责任链中,将处理请求的行为独立成对象,通过链的结构将所有行为串联起来。这样的结构十分常见,如银行的业务处理流程,公司采购流程等,它们都是属于这样的结构。还有一种更为常见的形式,就是处理者在接受请求时,可以决定是否处理或交给下一个处理者处理,所有每个请求者最多有一个处理者进行处理,要么就没有处理者处理。
结构
说明
- 抽象处理者(Handler)- 定义所有处理请求的接口,其中还包含一个后续连接。
- 基础处理者(Base Handler,可选)- 提取所有具体处理者的代码公有部分,如执行判断,执行,设置下个后继点等,本身是为了提高代码复用率。
- 具体处理者(Concrete Handler)- 实现请求处理的方法,判断是否处理本次请求,是否将请求传给下个后继点。
实现
根据怒气值来释放不同的技能。
技能枚举
public enum AngerSkill
{
None,
One,
Two,
Three,
}
处理者接口
public interface IHandler
{
IHandler NextHandler {
set; }
AngerSkill Release(int angleValue);
}
基础处理者
public abstract class BaseHandler : IHandler
{
private IHandler _nextHandler;
//实现后继节点方法
public IHandler NextHandler
{
set => _nextHandler = value;
}
//使用了模板方法模式,定义算法流程,具体实现分配到子类
public AngerSkill Release(int angerValue)
{
if (IsAllow(angerValue))
return Realization();
return _nextHandler?.Release(angerValue) ?? AngerSkill.None;
}
//实现行为的方法
protected abstract AngerSkill Realization();
//判断是否可以执行此行为的条件
protected abstract bool IsAllow(int angerValue);
}
技能处理者 - 具体处理者
//技能一
public class AngerSkillOne : BaseHandler
{
protected override AngerSkill Realization() => AngerSkill.One;
protected override bool IsAllow(int angerValue) => angerValue > 10 && angerValue < 30;
}
//技能二
public class AngerSkillTwo : BaseHandler
{
protected override AngerSkill Realization() => AngerSkill.Two;
protected override bool IsAllow(int angerValue) => angerValue >= 30 && angerValue < 60;
}
//技能三
public class AngerThree : BaseHandler
{
protected override AngerSkill Realization() => AngerSkill.Three;
protected override bool IsAllow(int angerValue) => angerValue >= 60;
}
技能工厂(负责创建,生成责任链,连接相关节点)
public class AngerSkillFactory
{
public static IHandler CreateSkill()
{
IHandler skill1 = new AngerSkillOne();
IHandler skill2 = new AngerSkillTwo();
IHandler skill3 = new AngerThree();
skill1.NextHandler = skill2;
skill2.NextHandler = skill3;
return skill1;
}
}
调用端
public class ResponsibiltyExample : MonoBehaviour
{
private IHandler _skill;
private InputField _inputField;
private TMP_Text _text;
private void Awake()
{
_skill = AngerSkillFactory.CreateSkill();
_inputField = GetComponentInChildren<InputField>();
_text = GetComponentInChildren<TMP_Text>();
_inputField.onEndEdit.AddListener(ActivateSkills);
}
private void ActivateSkills(string angerValue)
{
if (!int.TryParse(angerValue, out int value)) return;
var angerSkill = _skill.Release(value);
_text.text = angerSkill switch
{
AngerSkill.None => "Lack Of Anger",
AngerSkill.One => "Skill One",
AngerSkill.Two => "Skill Two",
AngerSkill.Three => "Skill Three",
_ => throw new ArgumentOutOfRangeException()
};
}
}
应用场景
- 当一个请求需要多个处理者共同处理时,属于一对多情况下,使用责任链模式。
- 需要按顺序来进行处理时。
- 处理者和处理顺序需要动态改变
- 请求由一个处理者执行,但处理者有多个,请求需要在链上寻找可以执行的处理者。
优缺点
优点
- 可以自由选择执行流程(有点像链表)
- 发起操作和执行操作的类解耦,单一职责原则
- 无需修改客户端,便添加新的职责,开闭原则
缺点
- 部分请求可能出现未被处理的情况
- 对于长的责任链,请求处理涉及多个处理对象,系统速度降低
与其他模式关系
- 责任链 与 命令 都是请求者与实现者之间的连接。责任链是一对多,将请求动态的传递到每个可能的处理者种,直至被处理或处理完毕为止。命令是一对一的单向连接,且通过参数化命令,来灵活的处理请求者和实现者的行为。
- 责任链 和 装饰 类结构十分相似,两者都是依赖组合将执行操作传递给一系列对象。责任链的处理对象具有独立性,且可以随时停止传递。装饰对象是在扩展原有方法的行为,且无法中断。
- 责任链 和 组合 模式一起使用,可以将请求沿包含全体父组件的链一直传递至对象树的底部。
- 责任链的连接可以使用 工厂模式 进行创建
- 责任链 和 模板方法 一起使用,可以提取处理者公有的流程行为,提高代码的复用。
边栏推荐
- 测试用例管理工具推荐
- 赋能智慧电力建设 | 麒麟信安高可用集群管理系统,保障用户关键业务连续性
- Number of exchanges in the 9th Blue Bridge Cup finals
- Flask搭建api服务-生成API文档
- LeetCode 152. Product maximum subarray daily question
- The mail server is listed in the blacklist. How to unblock it quickly?
- Test case management tool recommendation
- 麒麟信安操作系统衍生产品解决方案 | 存储多路径管理系统,有效提高数据传输可靠性
- SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名
- 管理VDI的几个最佳实践
猜你喜欢
麒麟信安加入宁夏商用密码协会
Lex & yacc of Pisa proxy SQL parsing
Seaborn数据可视化
科普达人丨一文弄懂什么是云计算?
[Seaborn] combination chart: facetgrid, jointgrid, pairgrid
QML初学
赋能智慧电力建设 | 麒麟信安高可用集群管理系统,保障用户关键业务连续性
浅浅理解.net core的路由
Sator launched Web3 game "satorspace" and launched hoobi
Sator a lancé le jeu web 3 "satorspace" et a lancé huobi
随机推荐
Test case management tool recommendation
Matplotlib绘制三维图形
麒麟信安操作系统衍生产品解决方案 | 存储多路径管理系统,有效提高数据传输可靠性
[fan Tan] those stories that seem to be thinking of the company but are actually very selfish (I: building wheels)
科普达人丨一文弄懂什么是云计算?
skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
Process from creation to encapsulation of custom controls in QT to toolbar (I): creation of custom controls
鲲鹏开发者峰会2022 | 麒麟信安携手鲲鹏共筑计算产业新生态
如何选择合适的自动化测试工具?
《产品经理必读:五种经典的创新思维模型》的读后感
邮件服务器被列入黑名单,如何快速解封?
SlashData开发者工具榜首等你而定!!!
MySQL implements the query of merging two fields into one field
PLC: automatically correct the data set noise, wash the data set | ICLR 2021 spotlight
LeetCode 312. Poke balloon daily
A tour of grpc:03 - proto serialization / deserialization
Biped robot controlled by Arduino
麒麟信安携异构融合云金融信创解决方案亮相第十五届湖南地区金融科技交流会
Rpcms method of obtaining articles under the specified classification
MySQL usage notes 1