什么是责任链模式

在讲责任链模式之前,我们先来看一下它的定义

责任链模式(Chain of Responsibility Pattern),顾名思义,它为请求创建了一个接收者对象的链。为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链,当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。(责任链模式也叫职责链模式)

通俗点来说,它为了保证让多个对象都有可能接收请求,于是就将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,同时实现了请求发送者与请求接收者直接的解耦。(请求发送者只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递,即实现了二者之间的解耦)

责任链模式中的三个角色:

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

责任链模式的实现

责任链模式实现背景: 我们在开发应用系统的过程中,经常会遇到记录日志的需求。日志分为三种类型,分是INFO(消息)、DEBUG(调试) 、ERROR(报错),当需要记录日志的时候,通过判断看看日志属于哪种类型, 然后对应的日志处理类再去处理相应的日志信息。

创建抽象的日志记录器类

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);
}
复制代码

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

class InfoLogger extends AbstractLogger {public InfoLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Info Logger:" + message);}
}class DeBugLogger extends AbstractLogger {public DeBugLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("DeBug Logger:" + message);}
}class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {System.out.println("Error Logger:" + message);}
}
复制代码

创建不同类型的记录器

public class Test {private static AbstractLogger getChainOfLoggers(){AbstractLogger infoLogger = new InfoLogger(AbstractLogger.INFO);AbstractLogger deBugLogger = new DeBugLogger(AbstractLogger.DEBUG);AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);infoLogger.setNextLogger(deBugLogger);deBugLogger.setNextLogger(errorLogger);return infoLogger;}public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "这是普通日志信息");loggerChain.logMessage(AbstractLogger.DEBUG,"这是调试日志信息");loggerChain.logMessage(AbstractLogger.ERROR,"这是错误日志信息");}
}
复制代码

责任链模式的优、缺点

最后我们总结一下责任链模式的优点与缺点

优点

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

优点二:简化了对象。使得对象不需要知道链的结构。

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

优点四:增加新的请求处理类很方便。

优点五:实现了责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

缺点

缺点一:不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。

缺点二:对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。

缺点三:职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

缺点四:可能不容易观察运行时的特征,给排查错误增加了难度。

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

  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. 开工啦!这本书助你快速回归高效工作状态
  2. python3+selenium调用浏览器驱动时报错的解决方法
  3. 电脑销售渠道_“新冠”影响下,平板电脑市场再现新商机
  4. Python---通配符的使用
  5. python判断是否在docker中
  6. coverage path planning覆盖路径规划(2021-左海民 )
  7. Hadoop入门进阶步步高(三-配置Hadoop
  8. 什么叫目标,什么叫事业,写得让我失眠!也送给我自己
  9. 比Postman更好用!在国产接口调试工具Apipost中使用Mock
  10. @Resource和@Autowired小笔记
  11. 软件测试c语言笔试题目,软件测试笔试题库及答案.docx
  12. PhpStorm中如何使用FTP功能
  13. P问题、NP问题、NPC问题、NPC-hard问题
  14. c语言双引号的三个作用是什么,文中“说话” 一词上所加引号的作用是什么
  15. python乘法函数_乘积(python乘法函数)
  16. 云和恩墨mysql_云和恩墨携手华为云鲲鹏云服务探索政企数据库升级的“新引擎”...
  17. 开源了一套wms系统,支持lodop和网页打印入库单、出库单。
  18. ZigBee设备OTA过程研究及优化
  19. 一个后端开发的 Vue 笔记【入门级】
  20. Android播放视频时屏幕保持唤醒不息屏

热门文章

  1. mysql sleep详解_MySQL Sleep进程
  2. 女朋友让我写 1 万字检讨
  3. neo4j 3.4.7安装和使用
  4. 中国疏水喷雾市场趋势报告、技术动态创新及市场预测
  5. LVDS接口分类与数据格式
  6. cocos creator SDK IOS
  7. html移动端源码,Framework7 (HTML 移动端框架) v4.1.0
  8. 快递驿站APP开发重点功能介绍
  9. 感人至深,splay的代码量
  10. 阿里canal的理解