6、行为型模式-责任链模式

news2024/9/19 10:51:11

一、责任链模式描述

责任链模式(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 中遇到很多应用。

三、责任链模式实现

1、实现思想

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

2、具体实现

1、步骤1-创建抽象的记录器类

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、步骤2-创建扩展了该记录器类的实体类

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


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


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

3、步骤3-测试调用链

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

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、步骤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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity AVPro 使用

AVPro 感觉我写的没多大用处&#xff0c;后面看看文档再完善一些。目前的东西是可以满足一些简单的需求的。 说明 标题名称内容Unity版本Unity 2021 .1.18f1c1AVPro 版本AVPro Video - Ultra Edition 2.5.6IDEVS2022系统版本Win 10 1909撰写日期2022 11月15日晚 需要注意的地…

防孤岛保护装置在光伏行业的应用

安科瑞 华楠 应用场景 防孤岛原理&#xff1a;防孤岛保护装置检测到并网点有逆功率、频率突变、 等异常数据时&#xff0c;即发生孤岛现象时&#xff0c;装置可配合断路器快速切除并网点&#xff0c;使本站与电网侧快速脱离&#xff0c;保证整个电站和相关维护人员的生命安全 …

Go:Signal信号量的简介与实践(优雅的退出)

文章目录简介一、kill与kill9的区别二、实践&#xff1a;优雅的退出小结简介 go中的信号量 有些信号名对应着3个信号值&#xff0c;这是因为这些信号值与平台相关&#xff0c;SIGKILL和SIGSTOP这两个信号既不能被应用程序捕获&#xff0c;也不能被操作系统阻塞或忽略。 一、…

智慧管廊解决方案-最新全套文件

智慧管廊解决方案-最新全套文件一、建设背景二、建设意义三、建设目标四、思路架构综合管廊目前存在的痛点1、安全防范不足2、管理技术落后3、信息孤岛问题4、多头管理问题五、建设方案六、获取 - 智慧管廊全套最新解决方案合集一、建设背景 综合管廊一般是建于城市地下用于容…

NUMA架构详解

基本概念 为什么要有多处理器架构&#xff1f; 由于摩尔定律的失效&#xff0c;单个CPU内的晶体管的数量接近于饱和状态&#xff0c;因此单个CPU的性能已经接近饱和状态&#xff0c;这时&#xff0c;要想提高计算机的性能&#xff0c;就必须朝着多核架构发展。多核架构中&…

力扣(leetcode)刷题分享,简单题(第2期)

力扣第二期介绍1. 反转链表2. 移除链表元素3. 找链表的中间节点4. 寻找链表中的倒数第k个结点5. 合并两个有序链表总结第二期介绍 本期博客主要讲解的题目是有关链表的一些经典OJ题&#xff0c;有一定难度&#xff0c;希望大家耐心看完。 1. 反转链表 题目介绍&#xff1a; …

VUE Date类型前端判断动态校验

需求 原本需求 一个编号和一个日期在流程中的审查人节点必填&#xff0c;于是我就直接写了前端必填校验 所有代码和名称已做更改&#xff0c;不涉及到公司隐私 <CustomFormItem label"登记编号" prop"registerNo" v-if"asset_examiner form.node …

cleanmymac2023免费版纯净mac电脑系统管家

如今&#xff0c;我们在生活的方方面面都使用支持互联网的设备——查找信息、购物、银行、做作业、玩游戏&#xff0c;以及与朋友和家人保持联系。因此&#xff0c;我们的设备包含许多关于我们的个人信息。 此外&#xff0c;随着时间的推移&#xff0c;任何伟大的设备都会变得…

VIAVI唯亚威FFL-050/-100 可视故障定位仪

不管是进行安装还是故障排查&#xff0c;可视故障定位仪 (VFL) 都是快速、 方便定位光纤问题区域的必要工具。通过显示光纤损坏的准确位置&#xff0c; 技术人员能诊断、定位并有效地修复故障点。VFL 也可用于执行连接 性测试和光纤识别。 用于检查光纤弯曲和断裂、损伤位置和…

iNFTnews|Facebook、Twitter先后扑街,社交媒体的未来属于Web3?

最近埃隆马斯克&#xff08;Elon Musk&#xff09;收购推特的举动引发了热议。一方面&#xff0c;一些用户认为这位特立独行、做事说一不二的亿万富翁可以真正充分发挥平台的巨大潜力。但另外一部分人却因此担忧互联网未来的发展。 想想看&#xff0c;推特是世界上用户最多的社…

javaweb之会话技术

Cookie Cookie的基本使用 对于Cookie的使用&#xff0c;我们更关注的应该是后台代码如何操作Cookie&#xff0c;对于Cookie的操作主要分两大类&#xff0c;本别是发送Cookie和获取Cookie,对于上面这两块内容。 1、发送Cookie 创建Cookie对象&#xff0c;并设置数据 Cookie c…

6-1 邻接矩阵存储图的深度优先遍历

6-1 邻接矩阵存储图的深度优先遍历 分数 20 作者 DS课程组 单位 浙江大学 试实现邻接矩阵存储图的深度优先遍历。 函数接口定义&#xff1a; void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );其中MGraph是邻接矩阵存储的图&#xff0c;定义如下&#xff1a; t…

35岁互联网人只会被清退,是我听过最大的谎言

作为一个在测试行业摸爬滚打11年的老鸟&#xff0c;距离35岁还有两个月&#xff0c;目前在一家互联网公司担任 测试总监 的岗位。回看这些年的进阶之路&#xff0c;能做到今天的职位&#xff0c;关键的就是那几步。 而我认识的目前已失业和依然在做基层测试的同行&#xff0c;…

谷歌插件使用开发

谷歌插件 谷歌浏览器扩展程序&#xff1a;扩展是 Web 平台中使用的HTML、CSS、JavaScript、图像和其他文件的压缩包。可以修改用户浏览并与之交互中的web内容&#xff0c;它们还可以扩展和更改浏览器本身的行为。 开发核心 api 文档&#xff1a;link 插件主要是根据包内的mani…

mysql数据库主从同步

数据库版本 主&#xff1a;5.7.34 从&#xff1a;8.0.21 主数据库 修改mysql配置文件 my.ini&#xff08;windows&#xff09; 查看配置文件存在位置 -- 查看配置文件存在位置 show variables like %data%;修改内容 boo_db为同步的数据库名 server-id1log-binmysql-bin#目标…

手写一个单例模式,Demo,检测

手写一个单例模式&#xff0c;Demo&#xff0c;检测需求分析单例介绍一般情况DemoResult单例模式&#xff08;饿汉式—静态常量方式&#xff08;线程安全&#xff09;&#xff09;DemoResult懒汉式&#xff08;线程不安全&#xff09;DemoResult懒汉式&#xff08;加入锁机制&a…

K8s安装乐维5.0应用部署文档

乐维产品包具体打包为4个镜像包&#xff0c;分别为&#xff1a;mysql5.7.36.tar、zabbix_server.tar、itops_v1_4_x86_64.tar、bpm0.1.tar&#xff0c;对应的配置文件分别为&#xff1a;data.tar、conf.tar、nginx-v1.3.tar.gz、bpm12.zip。 K8s yaml文件具体打包为strogeclas…

[附源码]Python计算机毕业设计django学生学习评价与分析系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数字逻辑·时序线路分析【触发器和时序线路分析方法】

课程目标 掌握触发器的特征表达式掌握触发器的激励表掌握触发器的状态表掌握时序线路分析方法 课程内容 D触发器 逻辑符号可以不画RD&#xff0c;SD&#xff0c;CP 上方&#xff1a;特征表达式&#xff1b;左下&#xff1a;激励表&#xff1b;右下&#xff1a;状态图 状态图…

list容器(20221117)

一、list容器 1、基本概念 功能&#xff1a;将数据进行链式存储 链表是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过指针实现的 链表由一系列的节点组成&#xff1b; 节点的组成&#xff1a;一个是存储数据元素的数据域&#xff0c;另一个是存…