【Unity与23种设计模式】责任链模式(Chain of Responsibility)
GoF中定义:
“让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度。将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止。”
举个现实中的例子:
电信公司的客服系统。
公司有很多客服,需要客服解决的问题更加纷繁复杂
然而,每个问题都要经由每个客服,显然是不合理的
于是,就把客服分层
当有电话打进来时,首先接入的是电信客服
电信客服询问之后,发现问题自己没法解决,可能与网络业务有关,于是转接网络业务客服
如果网络业务客服也没有解决问题,又转给了网络机房客服
最终问题得以解决。
责任链模式让一群信息接收者能够一起被串联起来管理,让信息判断上能有一致的操作接口
不必因为不同的接收者而必须执行“类转换操作”,并且让所有的信息接收者都有机会可以判断
是否提供服务或将需求移往下一层接收者
游戏中的例子便是植物大战僵尸的关卡设计
判断消灭了多少僵尸,或者场上没有僵尸时跳转到下一波僵尸(下一关)
//请求接收者接口
public abstract class Handler {
protected Handler m_NextHandler = null; public Handler(Handler theHandler){
m_NextHandler = theHandler;
} public virtual void HandleRequest(int Cost) {
if (m_NextHandler != null)
m_NextHandler.HandleRequest(Cost);
}
}
//定义3个子类实现Handler接口,处理传入参数Cost所需要的判断
public class ConcreHandler1 : Handler {
private int m_CostCheck = ;
public ConcreHandler1(Handler theNextHandler):base(theNextHandler) {} public override void HandleRequest(int Cost)
{
if (Cost <= m_CostCheck)
Debug.Log("ConcreteHandler1.HandleRequst核准");
else
base.HandleRequest(Cost);
}
} public class ConcreHandler2 : Handler {
private int m_CostCheck = ;
public ConcreHandler2(Handler theNextHandler) : base(theNextHandler) { } public override void HandleRequest(int Cost)
{
if (Cost <= m_CostCheck)
Debug.Log("ConcreteHanlder2.HandleRequst核准");
else
base.HandleRequest(Cost);
}
} public class ConcreHandler3 : Handler {
private int m_CostCheck = ;
public ConcreHandler3(Handler theNextHandler) : base(theNextHandler) { } public override void HandleRequest(int Cost)
{
Debug.Log("ConcreteHanlder3.HandleRequst核准");
}
}
//测试类
public class TestChainofResponsibility {
void UnitTest() {
ConcreHandler3 theHandler3 = new ConcreHandler3(null);
ConcreHandler2 theHandler2 = new ConcreHandler2(theHandler3);
ConcreHandler1 theHandler1 = new ConcreHandler1(theHandler2); theHandler1.HandleRequest();
theHandler1.HandleRequest();
theHandler1.HandleRequest();
theHandler1.HandleRequest();
theHandler1.HandleRequest();
}
}
//输出结果
//ConcreteHandler1.HandleRequest核准;
//ConcreteHandler2.HandleRequest核准;
//ConcreteHandler2.HandleRequest核准;
//ConcreteHandler3.HandleRequest核准;
//ConcreteHandler3.HandleRequest核准;
文章整理自书籍《设计模式与游戏完美开发》 菜升达 著
【Unity与23种设计模式】责任链模式(Chain of Responsibility)的更多相关文章
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- php 23种设计模式 - 责任链模式
责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
- C#设计模式-责任链模式(Chain of Responsibility Pattern)
引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...
- 设计模式-责任链模式Chain of Responsibility)
一.定义 职责链模式是一种对象的行为模式.在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- 责任链模式-Chain of Responsibility(Java实现), 例2
责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...
- 责任链模式-Chain of Responsibility(Java实现), 例1
责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
随机推荐
- java学习笔记(详细)
java平台 1.J2SE java开发平台标准版 2.J2EE java开发平台企业版 java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序.不同系统上要安装对应的虚 ...
- 深度学习中batch normalization
目录 1 Batch Normalization笔记 1.1 引包 1.2 构建模型: 1.3 构建训练函数 1.4 结论 Batch Normalization笔记 我们将会用MNIST数 ...
- SpringBoot CGLIB AOP解决Spring事务,对象调用自己方法事务失效.
对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,Sprin ...
- Supervisor使用说明
Supervisor是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程.它可以同时启动,关闭多个进程,使用起来特别的方便. 1.组成部分 s ...
- windows系统php配置redis
网上各种找教程各种不行,最后东拼西凑的终于把redis弄出来了. PHP版本:7.1.0: Redis版本:3.2.10: Windows版本:Windows7: 一.Windows下安装Redis ...
- 学web前端开发有前途吗
web前端开发现在如此火爆,可以说是引领了IT培训行业的一个潮流,那么web前端开发都要学些什么知识呢?为什么这么火有前途吗?现在行业很需要这种人才吗?还是大家盲目跟风,随大流,下面小编对web前端做 ...
- Ubuntu 11.04安装arm-linux-gcc-4.4.3/arm-none-linux-gnueabi-gcc安装包
准备工具和系统 arm-linux-gcc-4.4.3.tar.gz arm-linux-gcc-4.4.3下载地址: 下载在Linux公社的1号FTP服务器里,下载地址: FTP地址:ftp://w ...
- Hi3515支持NFS-ROOT启动
目前在做Hi3515平台监控项目,前期开发一直使用SDK里推荐的mount nfs方式来调试代码,虽然也算方便,但是我一直觉得用法NFS-ROOT才是最省事的方法,而且最接近最终用户使用环境,因为如果 ...
- linux命令--ldconfig和ldd用法
一.ldconfig ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig. ldconfig 命令的用途,主要是在默认搜寻目录(/ ...
- FindBugs找到错误(一)
FindBugs找到错误(一) 错误类型: SBSC_USE_STRINGBUFFER_CONCATENATION