文档章节

设计模式之责任链模式

chenxkang
 chenxkang
发布于 2017/04/27 20:20
字数 1135
阅读 1
收藏 0

       责任链模式,属于行为型设计模式,为请求创建了一个接收者对象的链,主要是对请求的发送者和接收者进行解耦。

  定义:责任链是一条由很多对象组成的链,链中的每个对象,除了最后一个对象外,都持有对下一个对象的引用,请求会在这个链上传递,直到链上的某个对象决定处理此请求为止。

  问题描述:通常做法,每一个请求的发送者和接收者都会一一对应的耦合在一起,使得系统不够灵活。

  解决方案:让多个接收者都有可能接收到请求,连接成一条链,请求沿着这条链传递,直到有对象来处理它为止,这就是责任链设计模式。

  结构图

  举个栗子:讲一个评分审核的故事。。。

  现在,我们公司有一个自评规则:当自评分数小于60分时,由系统审核;60~70分,由组长审核;70~80分由主管审核;80~90分,由总监审核;90~100分,由经理审核。这条自评规则中,每个角色都是一个处理者,我们可以将这些处理者放在一条责任链上,发送一个带有分数参数的请求,在这条链上进行传递,直到某一个角色决定处理为止。具体实现方式如下:

  1. 新建一个抽象处理者类ChainHandler,定义了处理数据的业务方法和设定和返回对下一个对象的引用方法。代码如下:

      

  2. 分别新建具体处理者类,均继承上面的抽象接口ChainHandler。代码如下:

      

          

  3. 在使用者类中定义责任链的传递路径,并传入分数进行处理。代码如下:

          

  4. 运行后的效果,如图所示:

      

  以上,我们就将请求和处理进行了解耦,请求者不需要知道是谁来处理的,处理者也不需要知道是谁发送的请求,只要符合自己的规则就进行相应的处理,并且这个责任链可以动态地添加或删除,也可以改变一个请求的处理过程,提高了系统的灵活性。

  我们发现使用者中,我们要去挨个儿创建责任链上的每一个对象,然后又逐个设定一个对象对下一个对象的引用,如果责任链相同的话,多个使用者就要多次编写同样的代码,那么我们可以使用代理模式来解决这个问题,将这个对象的创建和责任链的形成放在代理类中进行,具体实现方式如下:

  5. 新建一个代理类ChainProxyHandler,同样继承抽象接口ChainHandler,并持有责任链上第一个对象的引用。代码如下:

         

  6. 在使用者类中使用代理类来实现同样的功能。代码如下:

     

  7. 运行后的效果,如图所示:

         

  以上,我们就可以重用这个代理类,只要传入相应的参数即可,具体处理操作,由具体处理者来进行。如果需要改变责任链中对象的顺序,可以在代理类中进行修改,也可以增加新的方法。

 

  优点

  1. 将请求者和接收者解耦,请求者不知道是被哪个接收者处理的,而接收者也不知道是谁发送的请求;

  2. 增强了系统的灵活性,可以动态地添加或删除责任链,可以改变一个请求的处理过程。

  缺点

  1. 请求不一定被处理;

  2. 使用不当可能会造成死循环;

  3. 如果责任链比较长,可能会影响到系统性能。

 

  适用场景

  1. 有多个对象可以处理同一请求,而具体哪个对象处理由运行时决定,而被处理的对象不需要关心谁处理。

  2.  可以动态地指定一组请求处理类,并且可以动态的管理这些类。

© 著作权归作者所有

共有 人打赏支持
chenxkang
粉丝 1
博文 20
码字总数 19128
作品 0
杭州
程序员
私信 提问

暂无文章

面向对象接口多态

第3天 面向对象 今日内容介绍  接口  多态  笔记本案例 今日学习目标  写出定义接口的格式  写出实现接口的格式  说出接口中成员的特点  接口和抽象类的区别  能够说出使用多...

stars永恒
12分钟前
1
0
摄像头基础介绍

一、摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中...

天王盖地虎626
13分钟前
1
0
浅谈一致性Hash原理及应用

在讲一致性Hash之前我们先来讨论一个问题。 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/...

Java干货分享
35分钟前
2
0
React SSR样式及SEO的实践

前一篇主要记录了一下SSR配置以及结合Redux的使用。这里简单说一下React SSR中样式处理和更优雅的SEO SSR样式 在React客户端渲染,添加样式很容易。写一个css样式文件,在对应组件中引用。标...

前端小攻略
42分钟前
5
0
华为手机太猛!余承东吹的牛今天都实现了

华为是世界上少有的在2B和2C领域同时取得成功公司。如今,华为消费者业务的营收,已经在华为总营收中占据“半壁江山”。 12月27日,华为董事长郭平在新年致辞中披露,预计2018年华为预计实现...

linux-tao
52分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部