原文作者:C语言中文网

原文地址:责任链模式(职责链模式)详解

目录

1、模式的定义与特点

2、模式的结构与实现


在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有 Struts2 的拦截器、JSP 和 Servlet 的 Filter 等,所有这些,都可以考虑使用责任链模式来实现。

1、模式的定义与特点

责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了。责任链模式是一种对象行为型模式,其主要优点如下。

  1. 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  2. 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  3. 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  4. 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  5. 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

其主要缺点如下。

  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

2、模式的结构与实现

通常情况下,可以通过链表来实现职责链模式的数据结构。

1. 模式的结构

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

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

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

图1 责任链模式的结构图

图2 责任链

2. 模式的实现

package chainOfResponsibility;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("没有人处理该请求!");}}}
}

设计模式—责任链模式相关推荐

  1. Java设计模式-责任链模式

    Java设计模式-责任链模式,我想这是值得你了解一下下的啦. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持 ...

  2. 设计模式--责任链模式--Java实现

    设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...

  3. 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器

    理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...

  4. java责任链模式审批请假_Java设计模式-责任链模式

    Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...

  5. 一起学设计模式 - 责任链模式

    责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止. 概述 定义如下:一个请求有多个对象来处理,这些对象 ...

  6. 大话设计模式—责任链模式

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

  7. 设计模式 责任链模式

    责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...

  8. php设计模式-责任链模式

    最近重构代码发现责任链模式非常实用,所以简单总结了一下.总体来说,责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优 ...

  9. 深入理解设计模式-责任链模式(职责链模式)

    文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.设计一个所有处理器都要实现的接口 3.实现各种处理器 4.客户端 5. 输出 四.要点与优缺点 结尾 一.定义 避免请求发送者与接收者耦合 ...

  10. 工作中常用的设计模式 -- 责任链模式

    一般做业务开发,不太容易有大量使用设计模式的场景.这里总结一下在业务开发中使用较为频繁的设计模式.当然语言为 Java,基于 Spring 框架. 1 责任链模式(Chain of Responsib ...

最新文章

  1. [Java in NetBeans] Lesson 01. Java Programming Basics
  2. Android利用RecyclerView实现列表倒计时
  3. 空闲数据概念_计算机组成原理复习笔记——基础概念(二)
  4. Git 工作区、暂存区和版本库
  5. Go-select和switch的使用区别
  6. extJs相关名字解释
  7. 线上MYSQL同步报错故障处理总结 实现同步不一致进行邮件报警
  8. perl 正则表达式之匹配
  9. Python 数据科学手册
  10. 卸载北信源桌面监控攻略Uninstall VRV
  11. 关于MemoryBarrier
  12. Matlab中linspace函数的用法
  13. 生物学和计算机学哪个好,生物学和计算机
  14. 熠龙时空PC端职教模块
  15. tm4c123gxl库函数调包侠养成(四)——————串口发送的基本配置
  16. H5网页链接APP浏览器跳转小程序-邪少外链
  17. 记录 torch.optim.LBFGS
  18. ansible-playbook部署K8S高可用集群
  19. 微信公众平台有哪些营销互动活动呢?
  20. 2345内核拒绝服务漏洞(3)- WORD的锅

热门文章

  1. ajax 中文乱码问题 主要是IE浏览器
  2. 元组字典集合内置方法与拷贝
  3. git遇到的问题之“Please make sure you have the correct access rights and the repository exists.”...
  4. 6.Django与Ajax
  5. ASP.NET MVC编程——控制器
  6. 年少成名的我并没有放弃自己,谁敢说她\他文章比我写的好?!,不服来战!...
  7. B1928 日期差值
  8. C# does not contain a constructor that takes no parameter
  9. 关于android 图像格式问题
  10. QQ摘录 “废了!”