文档章节

设计模式之责任链模式

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
杭州
程序员

暂无文章

Spring详解

Spring详解(一)------概述 目录 1、什么是 Spring ? 2、Spring 起源 3、Spring 特点 4、Spring 框架结构 5、Spring 框架特征 6、Spring 优点   本系列教程我们将对 Spring 进行详解的介绍...

DemonsI
11分钟前
0
0
CentOS7系统Nginx安装

1、下载nginx,官方网站https://nginx.org wget https://nginx.org/download/nginx-1.14.0.tar.gz 2、下载Nginx Sticky Module,官方网站https://bitbucket.org/nginx-goodies/nginx-sticky-......

m_lm
15分钟前
0
0
使用zTree树控件(二)

1:treeNode.checked用于判断是勾选还是取消勾选。(treeNode指的是节点)

uug
15分钟前
0
0
export, import 和 export default的区别

ES6的两个功能: export 和 import export 对外输出模块 import 引入(加载)进来一个模块 一、export => import 单个变量 export var name = "lishi" 在其他文件里引用 import {name} f...

Js_Mei
20分钟前
1
0
打造RecyclerView的n级列表

先上效果图: 1.该多级列表的优势: 支持无限级列表展开 基于一个recyclerView实现 可以自定义每一级item的样式,定制化更强 2.设计的思路 数据结构List<ItemBean>,ItemBean类中有变量List<...

WelliJohn
29分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部