原文链接:

责任链模式 | 菜鸟教程​www.runoob.com

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

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

介绍

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

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

何时使用:在处理消息的时候以过滤很多道。

如何解决:拦截的类都实现统一接口。

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

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

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4、增加新的请求处理类很方便。

缺点: 1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错。

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

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

实现

我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

步骤 1

创建抽象的记录器类。

AbstractLogger.java

public abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;//责任链中的下一个元素protected AbstractLogger nextLogger;public void setNextLogger(AbstractLogger nextLogger){this.nextLogger = nextLogger;}public void logMessage(int level, String message){if(this.level <= level){write(message);}if(nextLogger !=null){nextLogger.logMessage(level, message);}}abstract protected void write(String message);}

步骤 2

创建扩展了该记录器类的实体类。

ConsoleLogger.java

public class ConsoleLogger extends AbstractLogger {public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("Standard Console::Logger: " + message);}
}

ErrorLogger.java

public class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("Error Console::Logger: " + message);}
}

FileLogger.java

public class FileLogger extends AbstractLogger {public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("File::Logger: " + message);}
}

步骤 3

创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。

ChainPatternDemo.java

public class ChainPatternDemo {private static AbstractLogger getChainOfLoggers(){AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;  }public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");}
}

步骤 4

执行程序,输出结果:

Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

哈斯机床进去debug模式_责任链模式相关推荐

  1. 行为型模式:责任链模式

    定义:责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处 ...

  2. Activiti 中的 命令模式与责任链模式

    Activiti 中的 命令模式与责任链模式 类图: 标准命令模式: 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化. 主要解决:在软件系统中,行为请求者与行为实现者通常是一 ...

  3. 工厂模式、策略者模式、责任链模式综合应用

    设计模式的具体运用: 简单工厂模式.策略者模式.责任链模式定义与使用 classLoader的具体运用 自定义的classloader 来动态加载类 程序功能设计: 在商城购物时,商城可能会在特殊的日 ...

  4. 设计模式——行为型模式之责任链模式(简简单单入门责任链,理解I/O流消息怎么逐步传递处理以及服务器框架转发)

    文章目录 前言 一.责任链模式定义 二.责任链模式结构 三.责任链高级应用 四.责任链模式优缺点 设计模式系列文章 结尾 前言 作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门 ...

  5. 设计模式-责任型模式(责任链模式)

    责任型模式是什么? 在责任链模式中很多对象都是由每一个对象对其下家的引用而联接起来形成一条责任链.请求在链上传递,直到链上的某一个对象决定处理次请求.发出这个请求的客户并不知道链上的哪一个对象最终处理 ...

  6. 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别

    状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...

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

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

  8. 状态模式与责任链模式

    文章目录 一.状态模式 二.责任链模式 三.状态模式与责任链模式对比 一.状态模式 状态模式定义:当一个对象的内在状态改变时允许其改变行为,这个对象看起来像是改变了其类.也就是说类中的状态改变了,再调 ...

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

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

最新文章

  1. 成人怎么学计算机英语单词,成人怎么从零开始学英语单词
  2. Python3开发过程常见的异常(最近更新:2019-04-26)
  3. pandas 将某一列转换为字符类型_6个冷门但实用的pandas知识点
  4. GraphPad Prism 9.0.2 for MacOS 2021最新完美版科研绘图统计软件 附安装使用教程
  5. 用JS解决多行溢出文本的省略问题
  6. c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
  7. 网络性能测试工具iperf详细使用图文教程【转载】
  8. element 组件中 el-form-item label= ‘vue介绍 (vue设置)‘ 强制换行
  9. 警钟 | 还不会Spring Boot集成JWT,你可能错过了大厂的Office了
  10. drools动态配置规则_微服务实战系列(八)-网关springcloud gateway自定义规则
  11. excel组合汇总_Excel汇总20150105
  12. python你好代码-再见,Python。你好,Go语言。
  13. DSP的时钟和系统控制
  14. 安装VC 6.0,出现 DOSX.EX must be in your AUTOEXEC.NT的信息
  15. 可控硅整流电路中的波形系数
  16. 使用python实现IP反查域名
  17. GIS领域的一些机器学习和人工智能的案例
  18. mipsel_24kc的linux内核,歌华链OpenWrt固件的软重启reboot补丁制作OpenWrt固件软重启补丁下载...
  19. Google Chrome在Windows7安装离线版
  20. 高质量毕业答辩PPT模板+PPT网站

热门文章

  1. 中国人民大学教授杜小勇:One Size Does not Fit All?
  2. 理清逻辑,确保云原生时代应用开发的全生命周期安全
  3. 足不出户带你体验专业实验室,技术实现不在话下
  4. 【华为云技术分享】云图说|人工智能新科技—文字识别服务
  5. 【鲲鹏来了】鲲鹏迁移过程案例分享
  6. 深入比特币原理(五)——高级交易与脚本
  7. java 1 0_【Java】1.0 开发环境
  8. 基于Matlab的跨孔CT胖射线追踪算法(四)
  9. 五分钟没有操作自动退出_消防设施操作员 精选练习题10.31
  10. MySQL统计两部分查询结果记录数量比值