定义

责任链是行为型设计模式的一种,通过前一个处理者记录下一个处理者的方式形成一条处理链。客户端在调用时只需要将请求传递到责任上即可,无需关注链路中的具体的传递过程。而链路中内部的处理,是按照前一个处理者记录的下一个处理者依次执行。这样可以避免客户端调用方和多个处理者对象耦合。

责任链模式结构

  • 抽象处理器 :定义下一个处理器对象和处理方法,交给子类实现
  • 具体处理器 :继承抽象处理类,对处理方法按需实现。在处理方法的最后调用下一个处理器的处理方法。
  • 调用方 :组装处理器链,将调用请求发送给处理器链的顶端。

类图

代码实现

使用JavaSE代码实现责任链模式。

定义抽象处理器


/*** 抽象处理器** @author lishuzhen* @createTime 2022年06月09日 21:22:00*/
public abstract class AbstractHandler {private AbstractHandler nextHandler;/*** 定义抽象方法,执行具体的计算逻辑** @return*/abstract public Object doFilter();public AbstractHandler getNextHandler() {return nextHandler;}public void setNextHandler(AbstractHandler nextHandler) {this.nextHandler = nextHandler;}
}

定义具体的处理器实现类

/*** A处理器实现** @author lishuzhen* @createTime 2022年06月09日 21:23:00*/
public class AHandler extends AbstractHandler {/*** 定义抽象方法,执行具体的计算逻辑** @return*/@Overridepublic Object doFilter() {System.out.println("A doSomething");if (getNextHandler() != null) {// 如果存在下一个处理器,则继续向下调用return getNextHandler().doFilter();}return new Object();}
}/*** B处理器实现** @author lishuzhen* @createTime 2022年06月09日 21:23:00*/
public class BHandler extends AbstractHandler {/*** 定义抽象方法,执行具体的计算逻辑** @return*/@Overridepublic Object doFilter() {System.out.println("B doSomething");if (getNextHandler() != null) {// 如果存在下一个处理器,则继续向下调用return getNextHandler().doFilter();}return new Object();}
}

定义调用方

public class ClientDemo {public static void main(String[] args) {// 构建A处理器对象AHandler aHandler = new AHandler();// 构建A处理器对象BHandler bHandler = new BHandler();// 组装处理器链, A处理器作为第一个处理器, 为A处理器设置下一个处理器aHandler.setNextHandler(bHandler);// 将请求发送给处理器链的顶端aHandler.doFilter();}
}

执行main方法

控制台打印日志如下,说明程序按照demo中设定好的 A -> B 顺序正确执行。

A doSomething
B doSomething

总结

优点

  • 降低了各个处理器之间的耦合,各处理器只关注处理自身的内部逻辑,然后抛给下一个处理器即可。不需要关注具体的上下游调用关系。
  • 提高可扩展性,可在组装处理器链时对链路进行扩展。
  • 可灵活调整各处理器之间的调用顺序

缺点

  • 调用方需要组装处理器链,虽然降低了处理器间的耦合,但是组装链时却存在耦合。(下一篇博文中会提出通过spring容器来解决创建链的问题)
  • 会增加程序的复杂度,需评估酌情使用,不可为了设计模式而用设计模式。

设计模式(四)责任链模式——责任链模式结构相关推荐

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

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

  2. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

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

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

  4. 设计模式学习笔记——责任链(Chain of Responsibility)模式

    设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...

  5. 设计模式--常用8个设计模式 单例-策略-责任链-装饰者-迭代器模式-观察者模式-常用设计模式

    1创建型的设计模式-主要有单例模式和工厂模式 对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题 2结构型的设计模式-主要有代理模式和适配 ...

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

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

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

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

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

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

  9. 责任链模式与策略模式

    责任链模式 Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间 ...

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

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

最新文章

  1. linux c send recv MSG_NOSIGNAL参数
  2. 关闭子页面刷新父页面,不需要弹出确认窗口
  3. java 有序列表_关于算法:在Java中为列表列表生成唯一的有序非重复组合
  4. C++编程思想:模板
  5. 五、Vue模块化开发学习笔记——JavaScript原始功能、匿名函数的解决方案、使用模块作为出口、CommonJS、ES6 export和import的使用
  6. SpringBoot之项目运行常见报错
  7. VMware Converter迁移linux系统虚拟机
  8. Go Token获取异常:token contains an invalid number of segments
  9. 云输入法linux版,ubuntu云输入法ibus cloud pinyin
  10. antd select show-search搜索时 拼音首字母匹配汉字模糊查询
  11. 腾讯下载的视频怎么转换成mp4格式
  12. MySQL第一节课总结
  13. 关于RabbitMQ启动慢问题的解决方法
  14. 一个关于创业不错的博客
  15. Hive批量删除历史分区
  16. 人脸识别实践(2) - 人脸识别系统展示
  17. 马一篇知乎大佬的诠释
  18. 实现西门子S71200/1500与三菱FX系列PLC通讯
  19. fineReport10连接达梦数据库
  20. 实验室装水的容器叫什么_实验室常见水的种类_生命之源水

热门文章

  1. php两个手机号正则表达式_最新手机号码正则表达式(php版)
  2. 全国互联电网调度管理规程(第一章__第九章)
  3. DOM系列:DOM树和遍历DOM
  4. 如何在JPG照片尺寸不变的情况下压缩大小?
  5. nginx安装配置、Nginx支持php
  6. 谈谈企业管理软件领域内那些很难稳定重现故障的处理技巧
  7. CBoard BI 数据可视化 支持国产开源
  8. Review CAP定律分布式系统
  9. 【机器视觉】移动机器人控制软件的设计与实现
  10. 3、用手机模拟器上的Autojs连接电脑vscode