责任链模式(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 final int INFO = 1;public static final int DEBUG = 2;public static final 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.");System.out.println();loggerChain.logMessage(AbstractLogger.DEBUG,"This is an debug level information.");System.out.println();loggerChain.logMessage(AbstractLogger.ERROR,"This is an error information.");}}

步骤 4
验证输出。

Standard Console::Logger: This is an information.File::Logger: This is an debug level information.
Standard Console::Logger: This is an 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.

设计模式探索之责任链模式相关推荐

  1. 简易理解设计模式之:责任链模式——OA中请假流程示例

    介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...

  2. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  3. 设计模式-请假流程-责任链模式

    责任链模式的定义 ​ 首先我们可以先看一下责任链模式的定义: ​ Avoid coupling the sender of a request to its receiver by giving mo ...

  4. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  5. [设计模式-行为型]责任链模式(Chain of Responsibility)

    概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  6. 《JAVA设计模式系列》责任链模式

    文章目录 责任链模式 责任链模式优缺点 应用场景 责任链模式的结构 实现流程 责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这 ...

  7. 【手写源码-设计模式15】-责任链模式-基于人事请假单工作流场景

    1:主题拆解 ①基本介绍 ②人事请假单工作流模拟 ③责任链模式的优缺点 ④适用场景 ⑤应用实例 ⑥ASP.NET 管道模型 2:基本介绍 责任链模式很像异常的捕获和处理,当一个问题发生的时候,当前对象 ...

  8. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  9. [Android设计模式之旅]——责任链模式

    介绍 责任链模式(Chain of Responsibility Pattern)就是当我们发送一个请求后,沿着一个任务链执行,任务链上每个对象都能处理该请求,如果一个对象不处理,就会传递给下一个对象 ...

最新文章

  1. 清华大学AMiner发布计算机科学会议(期刊)影响力排名
  2. 微信一次发两个ajax请求,微信浏览器发送ajax请求执行多次解决方法
  3. Leetcode 138. 复制带随机指针的链表 解题思路及C++实现
  4. tf.name_scope()与tf.variable_scope()
  5. 软件缺陷的优先级和严重性定义
  6. 直接排序python实现
  7. JZOJ 5384. 【NOIP2017提高A组模拟9.23】四维世界
  8. centos7 搭建Docker Registry
  9. c++ map初始化_Go学习每日一问(18)-map元素查找
  10. 利用SpringCloud搭建一个最简单的微服务框架
  11. 编译原理0909的作业
  12. 无法解析 org.apache.commons:commons-pool2:2.4.2
  13. 关于高效找工作的几条建议
  14. linux 小巧的浏览器,Linux奇技淫巧:一款特别轻量级的网页浏览器
  15. 【有问不答】一维信号临界采样/过采样/欠采样,并利用插值公式恢复信号(MATLAB)
  16. 网络安全组(NSG)简介
  17. sqlite C接口增删改查,数据库优化
  18. 国家信息中心副主任周民:加快形成网络安全的亮剑精神
  19. nodejs生成二维码
  20. 微信公众号网页授权记录

热门文章

  1. 源“ySQL 8.0 Community Server”的GPG密钥已安装,但是不适用于此软件包。请检查源的公钥URL是否配置正确。
  2. java高级——使用DOM4J解析xml
  3. 详解Fiddler Everywhere安装及入门使用
  4. Doris之ROLLUP
  5. Vue学习_计算属性
  6. Learning FileMaker 学习FileMaker Lynda课程中文字幕
  7. js获取url路径的方法
  8. Android SDK下载安装教程
  9. 苏州农商行:交易银行业务中台
  10. 用python将pt文件画图