当前位置:网站首页>责任链模式 - 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()
};
}
}


应用场景
- 当一个请求需要多个处理者共同处理时,属于一对多情况下,使用责任链模式。
- 需要按顺序来进行处理时。
- 处理者和处理顺序需要动态改变
- 请求由一个处理者执行,但处理者有多个,请求需要在链上寻找可以执行的处理者。
优缺点
优点
- 可以自由选择执行流程(有点像链表)
- 发起操作和执行操作的类解耦,单一职责原则
- 无需修改客户端,便添加新的职责,开闭原则
缺点
- 部分请求可能出现未被处理的情况
- 对于长的责任链,请求处理涉及多个处理对象,系统速度降低
与其他模式关系
- 责任链 与 命令 都是请求者与实现者之间的连接。责任链是一对多,将请求动态的传递到每个可能的处理者种,直至被处理或处理完毕为止。命令是一对一的单向连接,且通过参数化命令,来灵活的处理请求者和实现者的行为。
- 责任链 和 装饰 类结构十分相似,两者都是依赖组合将执行操作传递给一系列对象。责任链的处理对象具有独立性,且可以随时停止传递。装饰对象是在扩展原有方法的行为,且无法中断。
- 责任链 和 组合 模式一起使用,可以将请求沿包含全体父组件的链一直传递至对象树的底部。
- 责任链的连接可以使用 工厂模式 进行创建
- 责任链 和 模板方法 一起使用,可以提取处理者公有的流程行为,提高代码的复用。
边栏推荐
- Solidity函数学习
- How to implement safety practice in software development stage
- LeetCode 1626. 无矛盾的最佳球队 每日一题
- LeetCode刷题day49
- LeetCode 1031. 两个非重叠子数组的最大和 每日一题
- Flask搭建api服务-生成API文档
- LeetCode 120. Triangle minimum path and daily question
- LeetCode 300. 最长递增子序列 每日一题
- The computer cannot add a domain, and the Ping domain name is displayed as the public IP. What is the problem? How to solve it?
- Sator a lancé le jeu web 3 "satorspace" et a lancé huobi
猜你喜欢

SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名

Master this promotion path and share interview materials

麒麟信安云平台全新升级!

skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配

Process from creation to encapsulation of custom controls in QT to toolbar (I): creation of custom controls

【Seaborn】组合图表:FacetGrid、JointGrid、PairGrid

Module VI

Is AI more fair than people in the distribution of wealth? Research on multiplayer game from deepmind

麒麟信安操作系统衍生产品解决方案 | 存储多路径管理系统,有效提高数据传输可靠性

Skimage learning (1)
随机推荐
How to add aplayer music player in blog
Solid function learning
Sator推出Web3游戏“Satorspace” ,并上线Huobi
[Seaborn] combination chart: facetgrid, jointgrid, pairgrid
Matplotlib绘制三维图形
Siggraph 2022 best technical paper award comes out! Chen Baoquan team of Peking University was nominated for honorary nomination
99% of users often make mistakes in power Bi cloud reports
Mrs offline data analysis: process OBS data through Flink job
LeetCode 1654. 到家的最少跳跃次数 每日一题
麒麟信安携异构融合云金融信创解决方案亮相第十五届湖南地区金融科技交流会
What is cloud computing?
Seaborn data visualization
On Apache Doris Fe processing query SQL source code analysis
Jenkins发布uniapp开发的H5遇到的问题
电脑无法加域,ping域名显示为公网IP,这是什么问题?怎么解决?
Lowcode: four ways to help transportation companies enhance supply chain management
如何在软件研发阶段落地安全实践
LeetCode 1043. 分隔数组以得到最大和 每日一题
skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配
DAPP defi NFT LP single and dual currency liquidity mining system development details and source code