职责链模式

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

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

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

实现

结构

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

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

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

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

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

结构图

代码实现

/*** @author:pier 2021/11/15**/
public class ChainOfResponsibilityPattern {public static void main(String[] args) {//组装责任链Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setNext(handler2);//提交请求handler2.handleRequest("one");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 {@Overridepublic 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 {@Overridepublic void handleRequest(String request) {if ( request.equals("two") ) {System.out.println("具体处理者2负责处理该请求!");} else {if ( getNext() != null ) {getNext().handleRequest(request);} else {System.out.println("没有人处理该请求!");}}}
}

结果运行

没有人处理该请求!
具体处理者2负责处理该请求!进程已结束,退出代码为 0

小结一下

/*
程序运行结果如下:
具体处理者2负责处理该请求!
*//*
在上面代码中,我们把消息硬编码为 String 类型,而在真实业务中,消息是具备多样性的,
可以是 int、String 或者自定义类型。因此,在上面代码的基础上,可以对消息类型进行抽象 Request,增强了消息的兼容性。
*/

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

  1. Java设计模式之行为型:责任链模式

    背景: 学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字.三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字! 上图将学生.辅导员.系主任.院长.校长组 ...

  2. 设计模式-行为型模式-责任链模式

    设计模式-行为型模式-责任链模式 定义 将请求沿着链传递,然后直到对象处理即可. UML图 代码 基本的责任链 public class Test{public void test(int i, Re ...

  3. 从真实项目中抠出来的设计模式——第三篇:责任链模式

    一:现实场景 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给实体赋值,如果是短信,邮件又是其他方式的赋 ...

  4. 设计模式的C语言应用-责任链模式-第三章

    模式介绍 责任链将需要触发的对象组成一条链,发送者将请求发给链的第一个接收者,并且沿着这条链传递,直到有一个对象来处理它或者直到最后也没有对象处理而留在链末尾端. 图表 1责任链模式流程图 责任链在C ...

  5. 设计模式 — 行为型模式 — 责任链模式

    目录 文章目录 目录 责任链模式 应用场景 代码示例 责任链模式 责任链模式,将多个处理方法连接成一条链条,请求将在这条链条上流动直到该链条中有一个节点可以处理该请求.通常这条链条是一个对象包含对另一 ...

  6. 设计模式-职责链模式(责任链模式)

    职责链模式 将一系列类似却职责不全相同的对象 像链表一样 链接起来,当有一个请求,需要找能处理请求的处理对象,针对每一个请求如果都需要记住能处理它的对象是非常麻烦的,于是可以通过这条职责链,一路暴力寻 ...

  7. 用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式...

    责任链模式 一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止 使用场景 1)有多个对象可以处理同一个 ...

  8. 设计模式笔记十四:责任链模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 责任链模式 顾名思义,责任链模式(Chain of Responsibi ...

  9. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用

    文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...

  10. 【设计模式】第五章 责任链模式

    第五章 责任链模式 文章目录 第五章 责任链模式 一.介绍 二.结构 三.实现 一.介绍 在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程等.公司员工请假,可批假 ...

最新文章

  1. 将构件发布到私有的nexus maven 仓库
  2. 自学计算机二级office用什么书,暑假里想要自学计算机二级office有哪些什么好的建议...
  3. Redis常用命令之操作List类型
  4. java命令可以但是javac命令找不到
  5. python anylogic_分享 | IE工具与仿真软件学习分享会
  6. class_create()函数
  7. 【maven】 在 MyEcplise上使用maven搭建Web项目
  8. 更改matplotlib中x或y轴上的“刻度频率”?
  9. 【汇编语言与计算机系统结构笔记02】整数的计算机表示与运算,C中的无符号字符(unsigned)和带符号字符(signed),补码,一些例题
  10. 炒股、投资免于恐惧的思考
  11. linux apache压缩包安装目录,源码包安装Apache服务
  12. H.264之几种开源解码器的对比评测
  13. 【数据恢复案例】.[decrypt20@firemail.cc].eking新型变种勒索病毒
  14. LuoguP2123 皇后游戏
  15. python 调用scp命令 实践
  16. java 输出小写‘a‘-‘z‘和大写‘A‘-‘Z‘
  17. 比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
  18. OpenStack常用运维命令手册-V1.0-黑夜青儿
  19. 类似QQ的聊天气泡效果
  20. H.264几大开源编码器简介

热门文章

  1. Comsol中引用matlab函数
  2. COMSOL中文指导教程全集
  3. 5W1H 和 鱼骨分析法
  4. 格雷希尔快速密封接头在燃油泵密封性能检测的作用
  5. kindle paperwhite2 root 密码修改方法
  6. Java打印正反等边三角形
  7. c51步进电机程序汇编语言,51单片机驱动步进电机(汇编语言)
  8. 微信小程序云开发实现微信小程序订阅消息服务通知教程
  9. ESP32学习10:TcpClient
  10. 【OpenCV】Retinex图像增强(SSR,MSR,MSRCR)