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. Mac下使用SSH(密钥)访问Github

    1,终端中输入:cd ~/.ssh 如果出现 -bash: cd: /Users/glamor/.ssh: No such file or directory,说明你之前没有用过.直接执行第二步. 如 ...

  2. 老男孩Python全栈开发(92天全)视频教程 自学笔记14

    day14课程内容: 深浅拷贝 #浅拷贝只能拷贝一层s=[1,'a','b']s1=s.copy()#浅拷贝print(s1)#[1, 'a', 'b']s[0]=2print(s1,s)#[1, ' ...

  3. SpringBoot+Mybatis+PageHelper简化分页实现

    前言 经过一段时间的测试和修改PageHelper插件逐渐走到了让我觉得靠谱的时候,它功能的就是简化分页的实现,让分页不需要麻烦的多写很多重复的代码. 已经加入我的github模版中:https:// ...

  4. ReportView动态加载带参数的RDCL文件及子报表

    本文来自Torres.Wu发表在博客园的博客,转载请标明出处. 同上一篇差不多,这次咱们加载带有子报表的RDCl文件.首先还是创建一个form程序,在form2窗体中添加一个ReporView控件,l ...

  5. CDN中前端层的复制

    前端层的复制是为了提高静态内容分发的性能和可扩展性.将静态内容的分发转由边缘服务器来完成是为了解决可扩展性的问题,因为这样做可以避免出现在对等点和广域网链路处的网络拥堵风险,而这两个地方的拥堵是网络延 ...

  6. 使用WinDbg内核调试

    首先你要配置好测试环境:参考VMware+Windgb+Win7 内核驱动调试 在你的主机上配置Symbols 配置sympath,C:\Users\Admin\Desktop\first\objch ...

  7. hi3531串口波特率计算

    波特率配置 通过配置寄存器UART_IBRD 和UART_FBRD 可以设置UART 工作的波特率,波特率 计算公式为: 当前波特率=UART 参考时钟频率(1/2 总线时钟频率)/(16 x 分频系 ...

  8. 字符串压缩 stringZip

    1,题目描述 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串.压缩规则:1. 仅压缩连续重复出现的字符.比如字符串 ...

  9. HTML5中的checkbox

    HTML5中的checkbox 1.选中checkbox (1)<input type="checkbox" checked/> (2)<input type=& ...

  10. bit 和 byte

    bit bit是计算机的最小的存储单元,一切数据最终都以bit的形式存放在计算机之中. 一个bit有且只有两种状态.要么是0,要么是1.像这样: 多个bit组合在一起就可以构成更复杂的数据.例如,8个 ...