前言

在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。

在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有 Struts2的拦截器、JSP和 Servlet 的 Filter 等,所有这些,都可以考虑使用责任链模式来实现。

介绍

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。

注意事项:在 JAVA WEB 中遇到很多应用。

优点

  1. 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。

  2. 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。

  3. 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。

  4. 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。

  5. 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

 主要缺点

  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。

  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。

  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

模式的结构与实现

职责链模式主要包含以下角色。

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。

模式的实现

职责链模式的实现代码如下:

public class ChainOfResponsibilityPattern {public static void main(String[] args) {//组装责任链Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setNext(handler2);//提交请求handler1.handleRequest("two");}
}
//抽象处理者角色
abstract class Handler {private Handler next;public void setNext(Handler next) {this.next = next;}public Handler getNext() {return next;}//处理请求的方法public abstract void handleRequest(String request);
}
//具体处理者角色1
class ConcreteHandler1 extends Handler {public void handleRequest(String request) {if (request.equals("one")) {System.out.println("具体处理者1负责处理该请求!");} else {if (getNext() != null) {getNext().handleRequest(request);} else {System.out.println("没有人处理该请求!");}}}
}
//具体处理者角色2
class ConcreteHandler2 extends Handler {public void handleRequest(String request) {if (request.equals("two")) {System.out.println("具体处理者2负责处理该请求!");} else {if (getNext() != null) {getNext().handleRequest(request);} else {System.out.println("没有人处理该请求!");}}}
}
/*
程序运行结果如下:
具体处理者2负责处理该请求!
*//*
在上面代码中,我们把消息硬编码为 String 类型,而在真实业务中,消息是具备多样性的,可以是 int、String 或者自定义类型。因此,在上面代码的基础上,可以对消息类型进行抽象 Request,增强了消息的兼容性。*/

总结

我们常用的六个设计模式就讲完了,可能有写的不好的地方,希望大家多多包涵,也希望能对大家有一定的帮助。

设计模式之责任链模式(职责链模式)相关推荐

  1. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  2. 《设计模式详解》行为型模式 - 职责链模式

    职责链模式 6.4 职责链模式 6.4.1 概述 6.4.2 结构 6.4.3 案例实现 6.4.4 优缺点 6.4.5 JavaWeb 源码 - FilterChain 完整的笔记目录:<设计 ...

  3. 责任链模式(职责链模式)(Chain of Responsibility Pattern)

    学校OA 系统的采购审批项目:需求是 采购员采购教学器材 如果金额小于等于5000, 由教学主任审批(0<=x<=5000) 如果金额小于等于10000, 由院长审批(5000<x& ...

  4. 15、设计模式-行为型模式-职责链模式

    职责链模式 很多情况下,在一个软件系统中可以处理某个请求的对象不止一个,例如SCM系统中的采购 单审批,主任.副董事长.董事长和董事会都可以处理采购单,他们可以构成一条处理采购 单的链式结构,采购单沿 ...

  5. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  6. 设计模式与软考试题之职责链模式

    2007年下半年软件设计师考试下午试题最后一题考查职责链模式(责任链模式),原题如下: [全国计算机技术与软件专业技术资格(水平)考试 2007年下半年 软件设计师 下午试卷] 注:当年试题五.试题六 ...

  7. [转]23种经典设计模式的java实现_5_职责链模式

    对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即--将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它 ...

  8. 23种经典设计模式的java实现_5_职责链模式

    对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即--将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它 ...

  9. JS模式--职责链模式

    职责链模式的定义:使用多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链, 并沿着这条链条传递下去,直到有一个对象处理它为止. var order500 = f ...

  10. 5.js模式-职责链模式

    1. 职责链模式 将对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. var chain = function(fn){ this.fn = fn; this.successor = ...

最新文章

  1. JavaScript splice() 方法
  2. 初识 angular js
  3. Error: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-965200530-172.21.
  4. 笔记整理——linux程序设计
  5. 【载誉】致远互联荣获“2017最佳协同管理解决方案”殊荣
  6. bShare一个强大的网页分享插件
  7. 设置广告 php,设置ecshop广告位
  8. HDF5: Python 的h5py与Julia的HDF5库读取效率比较,不差上下
  9. cordova与android通信_使用Cordova插件实现两个app之间的相互调用和通讯
  10. 千里达v1000时速_《美骑评测》第10期 千里达V1000山地车 评测
  11. cf1102F. Elongated Matrix(状压dp)
  12. windows快捷键之打开网络连接
  13. windows进程管理器_探究 Process Explorer 进程树选项灰色问题
  14. IOS破解软件,比较全的网站。
  15. android 2.2(froyo)源码下载
  16. [bzoj3698]XWW的难题
  17. 1.python性能优化
  18. 企业如何做好线上学习平台运营?
  19. Peterson拓展到多线程情况
  20. 一个电压跟随器的小故事

热门文章

  1. 软件定义安全的一点点理解
  2. cocos3.10游戏移植到安卓平台教程(c++版本)
  3. 白话强化学习(理论+代码)
  4. 多个excel文件批量导入到数据库
  5. MASS批量维护数据
  6. 中国各省市json地图,包括雄安
  7. 区块链对未来金融的重要影响
  8. iOS UITableView 取消弹性效果
  9. 钉钉如何发起直播?钉钉电脑版直播发起方法简述
  10. 值得收藏的6个资源网站,10T硬盘都不够装,老司机直称好用