设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析

在这里插入图片描述

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求沿着处理者链进行发送。每个处理者对象都有机会处理该请求,直到某个处理者决定处理该请求为止。这种模式的主要目的是避免请求的发送者和接收者之间的耦合关系,从而提高系统的可扩展性和灵活性。

一、核心思想

责任链模式的核心思想是将多个处理器以链式结构连接起来,使请求沿着链传递,直到有一个处理器决定处理此请求。它允许以一种松散耦合的方式组织对象,以便它们可以按顺序处理请求。

二、定义与结构

  • 定义:责任链模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连。请求在这个链上传递,直到链上的某一个对象决定处理此请求为止。

  • 结构

    • 请求者(Requester):发起请求的对象。
    • 处理者(Handler):负责处理请求的对象。处理者可以是一个具体的处理器,也可以是一个处理者的集合。每个处理者对象都包含对下一个处理者的引用。
    • 链首处理者(First Handler):链中的第一个处理者,通常也是默认的处理器。
    • 链尾处理者(Last Handler):链中的最后一个处理者,通常用于最终处理请求或作为请求的终结点。

三、角色

在责任链模式中,主要角色包括:

  • 抽象处理者(Handler):定义一个处理请求的接口,并维护一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler):实现抽象处理者的接口,处理它所负责的请求,并可以访问链中的下一个处理者。如果当前处理者无法处理请求,则将请求传递给下一个处理者。

四、实现步骤及代码示例

以Java为例,展示责任链模式的实现步骤和代码示例:

  1. 定义抽象处理者接口
public abstract class Handler {protected Handler next;public void setNext(Handler next) {this.next = next;}public abstract void handleRequest(String request);
}
  1. 实现具体处理者类
public class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(String request) {if ("Request1".equals(request)) {System.out.println("ConcreteHandler1 handles Request1");} else {if (next != null) {next.handleRequest(request);}}}
}public class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(String request) {if ("Request2".equals(request)) {System.out.println("ConcreteHandler2 handles Request2");} else {if (next != null) {next.handleRequest(request);}}}
}
  1. 客户端代码
public class Client {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setNext(handler2);Handler chain = handler1;chain.handleRequest("Request1"); // 输出: ConcreteHandler1 handles Request1chain.handleRequest("Request2"); // 输出: ConcreteHandler2 handles Request2chain.handleRequest("Request3"); // 无输出,因为没有处理者能够处理这个请求}
}

五、常见技术框架应用

1、以Servlet过滤器链为例

在Java的Servlet中,过滤器(Filter)链就使用了责任链模式。

  • 步骤一:创建过滤器(Filter)
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
// 自定义过滤器1
public class MyFilter1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter1执行前");filterChain.doFilter(servletRequest, servletResponse);System.out.println("MyFilter1执行后");}@Overridepublic void destroy() {}
}
// 自定义过滤器2
public class MyFilter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter2执行前");filterChain.doFilter(servletRequest, servletResponse);System.out.println("MyFilter2执行后");}@Overridepublic void destroy() {}
}
  • 步骤二:在web.xml中配置过滤器链
<filter><filter - name>MyFilter1</filter - name><filter - class>MyFilter1</filter - class>
</filter>
<filter - mapping><filter - name>MyFilter1</filter - name><url - pattern>/*</url - pattern>
</filter - mapping>
<filter><filter - name>MyFilter2</filter - name><filter - class>MyFilter2</filter - class>
</filter>
<filter - mapping><filter - name>MyFilter2</filter - name><url - pattern>/*</url - pattern>
</filter - mapping>
  • 当一个请求到达Servlet容器时,会按照过滤器在web.xml中配置的顺序执行。每个过滤器在doFilter方法中可以对请求进行预处理,然后调用filterChain.doFilter方法将请求传递给下一个过滤器或者目标Servlet。最后,在返回响应时,会按照相反的顺序再次经过过滤器。

2、前端框架中的应用

在前端框架中,责任链模式同样可以被应用来实现一些特定的功能。以下是一些责任链模式在前端框架中的应用举例:

事件处理

在前端框架中,事件处理是一个常见的功能。通过使用责任链模式,可以将多个事件处理器连接成一个链条,当某个事件发生时,它会沿着这个链条传递,直到有一个处理器处理它为止。例如,在一个基于Vue.js的Web应用中,可以创建一个事件处理器链条来处理不同类型的用户输入事件(如点击、键盘输入等)。每个处理器都可以根据自己的职责来决定是否处理该事件,或者将事件传递给下一个处理器。

表单验证

在表单提交之前,通常需要进行一系列的验证操作,如检查必填字段、验证邮箱格式等。通过使用责任链模式,可以将这些验证操作组织成一个链条,每个验证器都负责检查一个或多个特定的验证规则。当表单提交时,验证请求会沿着这个链条传递,直到所有验证器都通过或者找到第一个失败的验证器为止。这种方式可以使得表单验证更加灵活和可扩展。

权限控制

在前端应用中,权限控制是一个重要的功能。通过使用责任链模式,可以创建一个权限验证链条,每个验证器都负责检查用户是否具有某个特定的权限。当用户尝试访问某个受保护的资源时,权限验证请求会沿着这个链条传递,直到找到一个验证器允许用户访问或者所有验证器都拒绝为止。这种方式可以使得权限控制更加细粒度和灵活。

综上所述,责任链模式在前端框架中具有广泛的应用前景,可以用于实现事件处理、表单验证、权限控制等功能。通过合理使用责任链模式,可以提高代码的灵活性和可扩展性,降低系统之间的耦合度。

3、其他

在Java中,责任链模式常用于Servlet过滤器(Filter)、Spring AOP中的拦截器等。

六、应用场景

责任链模式通常用于以下场景:

多个对象可能处理一个请求,但具体的处理者事先并不确定。
可动态指定一组对象来处理一个请求。
需要简化对象之间的连接,即减少直接联系。
  1. 请求处理链:当一个请求需要经过多个处理步骤或处理者进行处理时。
  2. 日志记录系统:不同的处理者可以负责不同级别的日志记录。
  3. 身份验证和权限检查系统:每个处理者可以检查特定的条件,如用户名和密码的正确性、账户是否锁定等。
  4. 数据过滤和转换:在数据处理过程中,可以使用责任链模式来进行数据过滤和转换。
  5. 错误处理和异常处理系统:不同的处理者可以处理不同类型的错误或异常。
  6. 事件处理、状态管理等。

七、优缺点

优点

  1. 降低耦合度:责任链模式可以将请求的发送者和接收者解耦,使得请求发送者不需要知道哪个接收者会处理请求。
  2. 灵活性:责任链模式可以动态地组合处理者对象,实现灵活的请求处理过程。
  3. 可扩展性:可以很方便地添加或删除处理者对象,实现责任链的动态调整。
  4. 可维护性:责任链模式可以将复杂的请求处理过程分解为多个简单的处理步骤,并将每个步骤封装在一个处理者对象中,便于维护和扩展。
  5. 提高系统性能:责任链模式可以避免将一个请求发送给所有的接收者,从而提高系统的处理性能。

缺点

  1. 处理不了循环依赖的问题:如果责任链上的处理者对象之间存在循环依赖,就可能导致死循环或者无法正确处理请求。
  2. 可能导致请求得不到处理:如果责任链上的所有处理者对象都无法处理请求,就会导致请求得不到处理,从而浪费系统资源。
  3. 降低系统的稳定性:如果责任链上的某个处理者对象出现故障或者错误,就可能导致整个系统崩溃。此外,由于请求在链中传递,如果链很长,可能会影响处理速度。

综上所述,责任链模式是一种强大的设计模式,它允许以松散耦合的方式组织对象,实现灵活的请求处理过程。然而,在使用时需要注意其潜在的缺点,并采取相应的措施来避免或减轻这些问题。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 20.04 安装docker--小白学习之路

更新包 sudo apt-get update # 安装需要的软件包以使apt能够通过HTTPS使用仓库 sudo apt-get install ca-certificates curl gnupg lsb-release 使用清华大学源 # 添加Docker官方的GPG密钥 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo…

Linux之线程池与单例模式

目录 线程池 线程池代码 单例模式 饿汉模式单例模式 懒汉模式单例模式 在前几期&#xff0c;我们已经学习了多线程的创建和控制&#xff0c;学习了多线程中的同步和互斥&#xff0c;学习了多线程中的条件变量和信号量&#xff0c;基于此我们实现了基于阻塞队列和基于环形队…

The Dedicated Few (10 player)

The Dedicated Few (10 player) 少数精锐&#xff08;10人&#xff09; &#xff1a;以少于9人的阵容击败纳克萨玛斯的所有首领&#xff08;10人&#xff09; 历时2小时做完了&#xff0c;不容易啊&#xff0c;别人可以的咱也可以。 World of Warcraft [CLASSIC][80猎人][G…

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素…

vscode支持ssh远程开发

文章目录 一、生成ssh使用的公钥/密钥对二、使用vscode通过ssh连接服务器1.安装插件2.配置文件3.连接服务器4.新建文件夹&#xff0c;存放不同的任务 三、使用scp命令与服务器互传文件、文件夹1.检查Windows 系统是否支持scp命令2.在Windows系统本地的电脑向服务器传输文件、文…

Jmeter-压测时接口如何按照顺序执行

Jmeter-压测时接口如何按照顺序执行-临界部分控制器 在进行压力测试时&#xff0c;需要按照顺序进行压测&#xff0c;比如按照接口1、接口2、接口3、接口4 进行执行 查询结果是很混乱的&#xff0c;如果请求次数少&#xff0c;可能会按照顺序执行&#xff0c;但是随着次数增加…

day02-前端Web-JavaScript

目录 1. JS介绍2. 引入方式2.1 介绍2.2 演示 3. 基础语法3.1 书写规范3.2 变量3.2.1 let3.2.2 const3.2.3 注意 3.3 数据类型3.4 运算符3.4.1 运算符3.4.2 类型转换 3.5 流程控制语句 4. 函数4.1 格式一4.2 格式二 5. JS对象5.1 基本对象5.1.1 Array对象5.1.1.1 语法格式5.1.1.…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

算法(二)——一维差分、等差数列差分

文章目录 一维差分、等差数列差分一维差分例题&#xff1a;航班预订统计 等差数列差分例题&#xff1a;三步必杀例题&#xff1a;Lycanthropy 一维差分、等差数列差分 一维差分 差分解决的是 区间修改&#xff08;更新&#xff09;问题&#xff0c;特别是多次区间修改问题&…

深度学习笔记11-优化器对比实验(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…

FreeROTS学习 内存管理

内存管理是一个系统基本组成部分&#xff0c;FreeRTOS 中大量使用到了内存管理&#xff0c;比如创建任务、信号量、队列等会自动从堆中申请内存&#xff0c;用户应用层代码也可以 FreeRTOS 提供的内存管理函数来申请和释放内存 FreeRTOS 内存管理简介 FreeRTOS 创建任务、队列…

【设计模式】介绍常见的设计模式

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 ✨ 介绍一下常见的设计模式✨ Spring 中常见的设计模式 这期内容主要是总结一下常见的设计模式&#xff0c;可…

6 分布式限流框架

限流的作用 在API对外互联网开放的情况下&#xff0c;是无法控制调用方的行为的。当遇到请求激增或者黑客攻击的情况下&#xff0c;会导致接口占用大量的服务器资源&#xff0c;使得接口响应效率的降低或者超时&#xff0c;更或者导致服务器宕机。 限流是指对应用服务进行限制…

【动态规划篇】欣赏概率论与镜像法融合下,别出心裁探索解答括号序列问题

本篇鸡汤&#xff1a;没有人能替你承受痛苦&#xff0c;也没有人能拿走你的坚强. 欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;带你解答洛谷的括号序列问题&#xff08;绝对巧解&#xff09; 制作日期&#xff1a;2025.01.10 隶属专栏&#xff1a;C/C题…

数据库高安全—角色权限:权限管理权限检查

目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限&#xff1a;角色创建角色管理&#xff0c;从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍&#xff0c;本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…

深入浅出负载均衡:理解其原理并选择最适合你的实现方式

负载均衡是一种在多个计算资源&#xff08;如服务器、CPU核心、网络链接等&#xff09;之间分配工作负载的技术&#xff0c;旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样&#xff0c;以下是几种常见的实现方式&#xff1a; 1. 硬件负载均衡&…

Training-free regional prompting for diffusion transformers

通过语言模型来构建位置关系的,omnigen combine来做位置生成,其实可以通过大模型来做,不错。 1.introduction 文生图模型在准确处理具有复杂空间布局的提示时仍然面临挑战,1.通过自然语言准确描述特定的空间布局非常困难,特别是当对象数量增加或需要精确的位置控制时,2.…

麦田物语学习笔记:背包物品选择高亮显示和动画

如题,本篇文章没讲动画效果 基本流程 1.代码思路 (1)先用点击事件的接口函数去实现,点击后反转选择状态(isSelected),以及设置激活状态(SetActive),并且还需要判断该格子是否为空,空格子是点不动的,完成后以上后,出现的问题是高亮应该是有且仅有一个格子是高亮的,而现在可以让…