23种设计模式-行为型模式-责任链

文章目录

  • 简介
  • 问题
  • 解决
  • 代码
    • 核心改进点:
  • 总结

简介

责任链是一种行为设计模式,允许你把请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。

问题

假如你正在开发一个订单系统。 你希望限制系统访问,只允许认证用户创建订单。 而管理员拥有所有订单的完全访问权限。
按照一般的开发思路,你会依次执行这些检查。 只要接收到包含用户凭据的请求,系统就可以尝试认证。 如果认证失败, 那就没有必要再进行后续检查了。如下图。
请求必须经过一系列认证检查后才能由订单系统来处理
接着,关于认证检查的需求越来越多。比如为了不让原始数据直接传递到订单系统,需要在认证之后清理请求中的数据;比如为了对暴力密码破解或者爬虫请求进行限流,又需要在认证之后增加过滤来自同一 IP 地址的重复请求逻辑;比如为了提高系统响应速度,降低系统负载,又需要在请求发送给系统之前检查有没有缓存结果,如果没有才会把请求发送给系统。如下图,这部分逻辑就会越来越多,越来越混乱。
代码变得越来越多, 也越来越混乱
而且,修改某个检查步骤可能也会影响其他的检查步骤。 尤其是当你希望复用这些检查步骤来保护其他系统时,你只能复制部分代码, 因为这些系统只需要部分检查步骤。

解决

与许多其他行为设计模式一样, 责任链会把 特定行为转换成 叫做处理者的独立对象。 在上面示例里, 每个检查步骤都可以被抽取成仅有单个方法的类, 并执行检查操作。 请求和对应数据会被作为参数传递给这个方法。

这个模式建议你把这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于下一个处理者的引用。 除了处理请求外, 处理者还负责沿着链传递请求。 请求会在链上移动, 直到所有处理者都有机会对他进行处理。
更重要的是: 处理者可以决定不再沿着链传递请求, 这就可以高效地取消所有后面的处理步骤。
在我们的订单系统示例中, 处理者会在进行请求处理工作后决定要不要继续沿着链传递请求。 如果请求中包含正确的数据, 所有处理者都会执行自己的主要行为, 无论这个行为是身份验证还是数据缓存。

处理者依次排列, 组成一条链
不过还有一种稍微不同的方式 (也是更经典一种), 那就是处理者接收到请求后自己决定是否能够对其进行处理。 如果自己能够处理, 处理者就不再继续传递请求。 因此在这种情况下, 每个请求要么最多有一个处理者进行处理, 要么没有任何处理者进行处理。 在处理图形用户界面元素栈中的事件时, 这种方式非常常见。另外,其实很多设计模式都是从很早用Java写客户端界面引出的解决方案。

代码

// Handler接口定义处理契约
public interface Handler {void handle(Request request) throws AuthException; 
}// BaseHandler实现链式传递逻辑
public abstract class BaseHandler implements Handler {private Handler next;public BaseHandler setNext(Handler next) {this.next = next;return this;}protected void passToNext(Request request) throws AuthException {if (next != null) next.handle(request);  // 核心链式调用逻辑}
}// 具体处理者1:用户认证
class UserAuthHandler extends BaseHandler {@Overridepublic void handle(Request request) throws AuthException {if (!validateUser(request.getUserId())) {throw new AuthException("用户未登录");}passToNext(request);  // 验证成功移交后续处理}
}// 具体处理者2:权限校验 
class PermissionHandler extends BaseHandler {@Override public void handle(Request request) throws AuthException {if (!checkAdminPermission(request.getUserId())) {throw new PermissionException("权限不足");}passToNext(request);}
}// Client动态组合处理链
public class OrderService {private Handler chain;public OrderService() {this.chain = new UserAuthHandler().setNext(new PermissionHandler());  // 灵活配置处理顺序}public void createOrder(Request request) {chain.handle(request);  // 统一入口触发处理链// 执行业务逻辑...}
}

核心改进点:

  1. 解耦检查逻辑:每个安全检查独立成类,通过setNext组合链式结构
  2. 动态扩展性:新增日志检查仅需创建LogHandler并插入链中任意位置
  3. 复用性增强:在PaymentService中可重用UserAuthHandler而不需要重复验证代码

总结

在这里插入图片描述

  1. (Handler)声明了所有具体处理者的通用接口。这个接口通常只包含单个方法,用于请求处理,但有时它还会包含一个设置链上 下一个处理者 的方法。
  2. (Base Handler)是一个可选的类,你可以把所有处理者共用的样本代码放在里面。 通常情况下,这个类里定义了一个保存下个处理者引用的成员变量。客户端可以把下个处理者传递给上个处理者的构造函数或用setter方法 来创建链。这个类还可以实现默认的处理行为: 比如确定下个处理者存在后再把请求传递给它。
  3. (Concrete Handlers)包含处理请求的实际代码。每 个处理者接收到请求后,都必须决定要不要处理,以及要不要沿 着链传递请求。 处理者通常是独立并且不可变的,需要通过构造函数一次性地获得 所有必要的数据。
  4. (Client) 可根据程序逻辑一次性或者动态地生成链。 需要注意一下,请求可以发送给链上的任意一个处理者,不一定是第一个处理者。

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

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

相关文章

注意力机制在大语言模型中的原理与实现总结

注意力机制在大语言模型中的原理与实现总结 1. 章节介绍 在大语言模型的学习中,理解注意力机制至关重要。本章节旨在深入剖析注意力机制的原理及其在大语言模型中的应用,为构建和优化大语言模型提供理论与实践基础。通过回顾神经网络基础及传统架构的局…

kafka消息可靠性传输语义

Kafka提供了多种消息传递语义,以适应不同的业务需求和可靠性要求。以下是Kafka消息传输的可靠性语义及其实现机制: 1. At Most Once(至多一次) 语义:消息可能会丢失,但不会被重复传递。 实现机制&#xf…

NLP高频面试题(三十三)——Vision Transformer(ViT)模型架构介绍

Transformer架构在自然语言处理领域取得了显著成功,激发了研究人员将其应用于计算机视觉任务的兴趣。Vision Transformer(ViT)应运而生,成为图像分类等视觉任务中的新兴架构。本文将介绍ViT的基本架构、工作原理,并与传…

Oracle数据库数据编程SQL<3.6 PL/SQL 包(Package)>

包是Oracle数据库中一种重要的PL/SQL程序结构,它将逻辑相关的变量、常量、游标、异常、过程和函数组织在一起,提供了更好的封装性和模块化。在大型项目中,可能有很多模块,而每一个模块又有自己的存过、函数等。而这些存过、函数默认是放在一起的,如果所有的存过函数都是放…

机器学习 分类算法

【实验名称】 实验:分类算法 【实验目的】 1.了解分类算法理论基础 2.平台实现算法 3. 编程实现分类算法 【实验原理】 分类(Categorization or Classification)就是按照某种标准给对象贴标签(label),再根据标签来区分归类。 【实验环境】 OS:Ubuntu16.0…

HTML5 Canvas绘画板项目实战:打造一个功能丰富的在线画板

HTML5 Canvas绘画板项目实战:打造一个功能丰富的在线画板 这里写目录标题 HTML5 Canvas绘画板项目实战:打造一个功能丰富的在线画板项目介绍技术栈核心功能实现1. 画板初始化与工具管理2. 多样化绘画工具3. 事件处理机制 技术要点分析1. Canvas上下文优化…

【YOLOv8】YOLOv8改进系列(12)----替换主干网络之StarNet

主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: YOLOv8结构解读 YOLOv8…

1Panel 面板 宝塔面板 Ubuntu 24.04

1Panel 面板 宝塔面板 Ubuntu 24.04 https://1panel.cn/ 1Panel 是一款开源的 Linux 服务器运维管理面板,它就像是给服务器配上了一个智能管家,让我们能通过 Web 端轻松管理服务器。以往我们管理 Linux 服务器,常常需要在命令行中输入各种复…

Node.js全局生效的中间件

目录 1. 目录结构 2. 代码实现 2.1 安装Express 2.2 app.js - 主文件 2.3 globalMiddleware.js - 全局中间件 3. 程序运行结果 4. 总结 在Node.js的Express框架中,全局生效的中间件是指应用程序启动后,对所有请求都有效的中间件。它通常用于日志记…

WiFi(无线局域网)技术的多种工作模式

WiFi(无线局域网)技术支持多种工作模式,以满足不同的网络需求和应用场景。以下是主要的WiFi工作模式及其详细说明: 1. 基础设施模式(Infrastructure Mode) [无线接入点 (AP)]/ | \ [客户端…

PHP 8.x:现代Web开发的性能与效率革命

随着PHP 8.x系列的持续演进,这门诞生于1995年的“古老”语言正焕发新生。通过引入革命性的JIT编译器、类型系统增强及一系列现代化语法特性,PHP 8.x不仅巩固了其在Web开发领域的统治地位,更将性能与开发者体验推向新高度。 一、JIT编译器&am…

【扣子agent入门】搭建计算热量工作流

一、食物热量知识库 1. 创建知识库 工作空间——资源库——创建资源>知识库 2. 自动采集网页数据 文本格式>在线数据 自动采集 找一个食物热量网站进行采集。 一定要让知识按条数分段,不然不好查询。 二、 意图识别节点 意图识别(In…

脑影像分析软件推荐 | JuSpace

目录 1. 软件界面 2.工具包功能简介 3.软件安装注意事项 参考文献: Dukart J, Holiga S, Rullmann M, Lanzenberger R, Hawkins PCT, Mehta MA, Hesse S, Barthel H, Sabri O, Jech R, Eickhoff SB. JuSpace: A tool for spatial correlation analyses of magne…

微信小程序唤起app

1、前提 1、app与小程序主体需一致&#xff0c;可以前往微信公众平台关联。 2、小程序的场景值为1069&#xff0c;也就是得从app打开小程序&#xff0c;小程序才能唤起app。 2、vue3代码示例 <template><view class"maxBox bgc"><button open-typ…

jarvisoj API调用 [JSON格式变XXE]

http://web.jarvisoj.com:9882/ 题目要求&#xff1a;请设法获得目标机器 /home/ctf/flag.txt 中的flag值 抓包得到&#xff1a; POST /api/v1.0/try HTTP/1.1 Host: web.jarvisoj.com:9882 Content-Length: 36 Accept-Language: zh-CN,zh;q0.9 User-Agent: Mozilla/5.0 (W…

3. 矩阵置零

leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 根据行和列检测出0所在位置&#xff0c;并将行和列数组的对应位置改为true如果遍历到某一行列时&#xff0c;只要行和列数组里面有一个是true&#xff0c;就置为0 提示&#…

【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题

处理网络请求时&#xff0c;我们经常会遇到需要中途取消请求的情况&#xff0c;比如用户在两个tab之间反复横跳的场景&#xff0c;如果每个接口都从头请求到结束&#xff0c;那必然会造成很大的服务压力。 AbortController是一个Web API&#xff0c;它提供了一个信号对象&…

C语言跳表(Skip List)算法:数据世界的“时光穿梭机”

在数据结构算法中&#xff0c;有一种算法犹如“时空穿梭机”&#xff0c;能在瞬间跨越层层障碍&#xff0c;直击目标——它就是跳表算法。下面&#xff0c;就让我们一起揭开跳表算法的神秘面纱&#xff0c;通过实例探究其高效与魅力。 目录 一、跳表算法是什么&#xff1f; …

2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、日期统计-&#xff08;解析&#xff09;-暴力dfs&#xff08;&#x1f609;蓝桥专属 2、01串的熵-&#xff08;解析&#xff09;-不要chu…

批量将文本文件转换为 Word/PDF/Excel/图片等其它格式

工作中我们经常会接触到各种格式的文本文档&#xff0c;比如说 txt 记事本文件、json文件、HTML格式文件等等。通常也会需要将文本文件转换为其他的格式&#xff0c;比如说将文本文件转换为 word 格式、PDF格式或者图片格式等等。当我们想要对文本文件格式进行批量转换的时候&a…