文章目录

  • 责任链模式
    • 结构
    • 实现
    • 应用场景
    • 优缺点
    • 与其他模式关系

责任链模式

责任链模式是对象行为型模式,该模式中请求者发送的请求需要沿着处理者链进行传递,并被处理者处理,这样可以避免请求发送者与多个处理者耦合。

责任链中,将处理请求的行为独立成对象,通过链的结构将所有行为串联起来。这样的结构十分常见,如银行的业务处理流程,公司采购流程等,它们都是属于这样的结构。还有一种更为常见的形式,就是处理者在接受请求时,可以决定是否处理或交给下一个处理者处理,所有每个请求者最多有一个处理者进行处理,要么就没有处理者处理。

结构

说明

  • 抽象处理者(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()};}}

应用场景

  • 当一个请求需要多个处理者共同处理时,属于一对多情况下,使用责任链模式。
  • 需要按顺序来进行处理时。
  • 处理者和处理顺序需要动态改变
  • 请求由一个处理者执行,但处理者有多个,请求需要在链上寻找可以执行的处理者。

优缺点

优点

  • 可以自由选择执行流程(有点像链表)
  • 发起操作和执行操作的类解耦,单一职责原则
  • 无需修改客户端,便添加新的职责,开闭原则

缺点

  • 部分请求可能出现未被处理的情况
  • 对于长的责任链,请求处理涉及多个处理对象,系统速度降低

与其他模式关系

  • 责任链 与 命令 都是请求者与实现者之间的连接。责任链是一对多,将请求动态的传递到每个可能的处理者种,直至被处理或处理完毕为止。命令是一对一的单向连接,且通过参数化命令,来灵活的处理请求者和实现者的行为。
  • 责任链 和 装饰 类结构十分相似,两者都是依赖组合将执行操作传递给一系列对象。责任链的处理对象具有独立性,且可以随时停止传递。装饰对象是在扩展原有方法的行为,且无法中断。
  • 责任链 和 组合 模式一起使用,可以将请求沿包含全体父组件的链一直传递至对象树的底部。
  • 责任链的连接可以使用 工厂模式 进行创建
  • 责任链 和 模板方法 一起使用,可以提取处理者公有的流程行为,提高代码的复用。

责任链模式 - Unity相关推荐

  1. Unity——责任链模式(土味情话传递)

    做项目学了个责任链模式,写了个例子记录一下~ (一本正经)先来看一下定义: 责任链模式的定义 定义: 使多个对象都有机会处理请求,从而避免请求的发送者与请求处理者耦合在一起.将这些对象连接成一条链,并 ...

  2. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

  3. Java 责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

  4. 设计模式之五 责任链模式(Chain of Responsibility)

    2019独角兽企业重金招聘Python工程师标准>>> 一. 场景 相信我们都有过这样的经历: 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理: 当我们 ...

  5. 一起学设计模式 - 责任链模式

    责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止. 概述 定义如下:一个请求有多个对象来处理,这些对象 ...

  6. 采购申请的处理流程 --- 责任链模式

    前情提要 上集讲到小光梳理了公司的组织架构, 利用组合模式建立起了一个可扩展变化的多层的组织架构体系. 更清晰地明确了公司各个层级, 各个部门的职责. 大家明确职责, 通力合作, 让"小光热 ...

  7. 折腾Java设计模式之责任链模式

    责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...

  8. 设计模式(9)-责任链模式详解(易懂)

    责任链模式的定义 责任链模式是一种设计模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  9. 最近学习了责任链模式

    2019独角兽企业重金招聘Python工程师标准>>> 前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时 ...

最新文章

  1. 网页级在线性能测试网站汇总
  2. java内存分配 常量池详解
  3. alertdialog.builder 自定义弹窗
  4. 广度优先搜索_计算机入门必备算法——广度优先遍历搜索
  5. git切换用户密码_Git 最基本的命令
  6. Linux Shell脚本入门教程系列之(六)Shell数组
  7. kali linux权限维持,msfconsole权限维持
  8. 【git学习】fatal: unable to access XXX: Failed to connect to github.com port 443: Timed out怎么解决
  9. 【Sentry使用】自定义transaction
  10. 数据结构_树状数组 详解
  11. 学前端好还是后端好?
  12. 某公司对新员工的公开信
  13. Flux发布Elixir Essential限制器,提供对全景声的支持
  14. [FJOI 2016]bzoj 4408 神秘数 - 线段树
  15. c++语言读取txt文件,C++中读写txt文件并分离字符的方法
  16. 卷积层的dropout - dropblock
  17. 信息爆炸时代的知识获取
  18. 汽车行业数字化转型:时代巨变下的新机遇
  19. 软件开发工程师工作总结
  20. 基于STM32的超声波倒车检测装置

热门文章

  1. 图像边检检测定义,边缘提取
  2. 项目部署--我爱起名网平台搭建学习研究(含php源码,亲测有效)
  3. 保护视力的软件:定时提醒你休息的桌面工具EyeLeo
  4. java计算机毕业设计婴幼儿玩具共享租售平台源程序+mysql+系统+lw文档+远程调试
  5. 传小米手环4将支持医疗级心率监测 健康成可穿戴新爆发点
  6. 计算机一级考试B十类理论题,计算机一级B试题+理论答案 10秋02
  7. 如何查询电脑的是ip地址
  8. 1.详细了解计算机如何工作
  9. 如何为自己的双目系统选取相机?
  10. java fel_开发中常用Fel的写法