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)的更多相关文章

  1. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  2. php 23种设计模式 - 责任链模式

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

  3. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

  4. 设计模式-责任链模式Chain of Responsibility)

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

  5. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  6. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  7. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  8. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  9. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  10. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

随机推荐

  1. 两种实现方式mycat多租户,枚举分片,注解拦截

    第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式  /*!mycat:schema=[schemaName] */   注意:这在navicat 里面是会报错的,请用命令行登陆myc ...

  2. spring oauth2 ,spring security整合oauth2.0 JdbcTokenStore实现 解决url-pattern .do .action

    参考以下两个文章: http://www.cnblogs.com/0201zcr/p/5328847.html http://wwwcomy.iteye.com/blog/2230265 web.xm ...

  3. PHPstudy端口占用的问题

    phpStudy很多同学下好了 用localhost可能不能读取到WWW目录下的文件,这个是因为端口被占用,打开其他选项菜单 =>打开配置文件=>httpd-conf=>修改端口号如 ...

  4. JMeter使用(Linux)

    JMeter是一个Java桌面应用程序,用户界面采用Swing Java Api实现,支持并发和多线程或者线程组的执行,对于配置负载测试和压力测试非常有用.Jmeter是开源.免安装的,只需要有jdk ...

  5. DSP_TMS32F2812的串口操作

    void scia_fifo_init(int ibaud) { SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parit ...

  6. 笔记︱决策树族——梯度提升树(GBDT)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记来源于CDA DSC,L2-R语言课程所 ...

  7. R语言︱逻辑运算

    R软件包含两个逻辑值,TRUE和FALSE.在其他编程语言中也称为布尔值(Boolean values).布尔向量就是充满着逻辑值的逻辑向量.那么有如何的应用呢? 1.比较运算可以产生逻辑值  > ...

  8. mysql字符串连接

    用SQL Server 连接字符串是用“+” 现在数据库用mysql, 写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作, ...

  9. 使用ffserver实现转发实时流媒体(摄像头捕获)

    本系统为ubuntu 10.04LTS 说明1:本实验在本机成功测试通过: 说明2:本实验仅仅测试了视频流,未测试音频流. 1.配置ffserver.conf -------------------- ...

  10. JDBC异常总结

    1.异常一 (1)详情如下 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source reje ...