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. 初学Python(第二课)

    一.列表.元组的操作 1.定义:列表类似于C中的数组,使用方法也相似.它的定义举例如下:letter = ['A','B','C','D','E','F']; 2.列表的切片 (1)访问一个元素且知道 ...

  2. MySQL 参数- Innodb_File_Per_Table(独立表空间)

    Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间某一个数据库的所有 ...

  3. FFMpeg首次使用

    FFMpeg在Windows上的使用.去FFMpeg官网上去下载文件. 把下载好的文件放如下图所示的位置. cmd,调出系统的命令行工具.首先进入d盘. 进入到ffmpeg所在的文件夹. 运行 ffm ...

  4. python+flask:实现POST接口功能

    1.首先需要安装python和flask,这个是必须的嘛. 2.我们这里实现的是一个POST功能的简单接口. from flask import Flask, request, jsonify imp ...

  5. FFmepg 如何在 window 上使用?

    下载FFmepg官网库直接使用即可. avdevice.lib avcodec.lib avfilter.lib avformat.lib avutil.lib postproc.lib swresa ...

  6. Ansible自动化运维笔记2(Ansible的组件介绍)

    1.Ansible Inventory (1)静态主机文件 默认的ansible invetory是/etc/hosts文件,可以通过ANSIBLE_HOSTS环境变量或者通过运行命令的时候加上-i ...

  7. SQL语句学习

    看似简单,但其实包含很多技巧思维 1.查询课程表中所有科目大于80的学生 select distinct name from student where name not in (select nam ...

  8. Hive语法

    1.Select 语法 SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_ ...

  9. docker学习笔记(二)

    一.常用Linux 命令 ls -a(同时列出隐含文件), -l(输出一个比较完整的格式,除每个文件名外,增加显示文件 类型.权限.硬链接数.所有者名.组名.大小(byte).及时间信息-----简化 ...

  10. linux memcached Session共享

    memcached memcached是高性能的分布式缓存服务器用来集中缓存数据库查询结果,减少数据库访问次数提高动态web应用的响应速度 传统web架构的问题许多web应用都将数据保存在RDBMS中 ...