设计模式学习之——责任链模式

ops/2024/11/28 7:23:09/

责任链模式的基本概念

定义责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照一定顺序处理请求,并且每个对象可以选择自己是否处理该请求或者将其传递给下一个对象处理。

核心思想:将多个处理请求的对象组成一条链,请求在这条链上传递,直到有一个对象处理它。

主要角色

  • 抽象处理者(Handler):定义一个处理请求的接口,并持有对下一个处理者的引用;
  • 具体处理者(ConcreteHandler):实现抽象处理者的接口,处理请求或将请求传给下一个处理者;
  • 客户端(Client):发起请求的对象,不需要知道谁处理了请求,也不需要知道具体的处理者。

责任链模式的使用场景

责任链模式适用场景:

1、当有多个对象可以处理同一个请求时;

2、当处理者之间的顺序不确定时,可以动态组织处理者之前顺序;

3、当请求的处理流程需要灵活配置时;

责任链模式的优缺点

优点

1、降低了请求的发送者和接收者之前的耦合度;

2、提高了系统的灵活性和可扩展性,可以动态地增加或删除处理者;

3、使得请求的处理流程更加清晰和易于维护

缺点

1、可能会导致性能问题,特别是当责任链过长或请求在链中被频繁传递时;

2、如果责任链配置不当,可能会导致请求无法被正确处理;

3、调试时可能会比较复杂,因为请求在链中的传递过程可能涉及多个处理者;

代码示例

以下是一个使用Java语言实现责任链模式的示例,演示了如何处理不同类型的请求

// 抽象处理者接口
abstract class Handler {protected Handler nextHandler;public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(String request);
}// 具体处理者A
class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(String request) {if ("A".equals(request)) {System.out.println("ConcreteHandlerA 处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 具体处理者B
class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(String request) {if ("B".equals(request)) {System.out.println("ConcreteHandlerB 处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 具体处理者C
class ConcreteHandlerC extends Handler {@Overridepublic void handleRequest(String request) {if ("C".equals(request)) {System.out.println("ConcreteHandlerC 处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建处理器链Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();Handler handlerC = new ConcreteHandlerC();// 将处理器连接在一起handlerA.setNextHandler(handlerB);handlerB.setNextHandler(handlerC);// 发送请求handlerA.handleRequest("A"); // ConcreteHandlerA 处理请求: AhandlerA.handleRequest("B"); // ConcreteHandlerB 处理请求: BhandlerA.handleRequest("C"); // ConcreteHandlerC 处理请求: ChandlerA.handleRequest("D"); // 无处理者处理请求: D(请求被忽略)}
}

在上面的示例中,我们定义了三个具体处理者(ConcreteHandlerAConcreteHandlerB 和 ConcreteHandlerC),它们分别处理不同类型的请求("A"、"B" 和 "C")。客户端代码创建了一个处理器链,并将请求发送到链上的第一个处理者(handlerA)。根据请求的类型,相应的处理者会处理请求,或者将请求传递给下一个处理者。如果请求的类型不匹配任何处理者,则请求会被忽略。

其他:

责任链模式常见的一些实际应用场景:

  • 用户登录验证
    • 在这种场景下,不同的验证步骤可以看作责任链中的不同节点,依次进行验证,直到所有验证都通过或某个验证失败为止。
    • 手机验证码登录:需要进行用户是否存在、验证码是否为空、验证码是否正确、用户是否锁定、用户是否被禁用等校验。
    • 用户名密码登录:需要进行用户是否存在、用户是否被锁定、密码校验等校验。
  • 请求处理系统

    • 如Web应用中的过滤器链,每个过滤器负责处理不同类型的请求或执行不同的任务,如身份验证、日志记录、请求参数修改等。
    • 请求依次经过责任链中的各个处理器,直到被某个处理器处理或所有处理器都遍历完。
  • 日志系统

    • 不同的日志级别(如INFO、DEBUG、ERROR)会对应不同的处理器。
    • 每个处理器负责处理对应级别的日志消息,并将其记录到相应的日志文件中或发送到日志服务器。
  • 事件处理系统

    • 在图形用户界面(GUI)应用中,事件(如鼠标点击、键盘输入)会触发一系列的处理动作。
    • 这些处理动作可以看作责任链中的不同节点,依次进行处理,直到事件被完全处理或某个节点决定不再继续处理。
  • 数据校验和转换

    • 在数据接收或发送过程中,可能需要对数据进行一系列的校验和转换操作。
    • 这些操作可以看作责任链中的不同节点,依次对数据进行处理,直到数据满足要求或处理完成。
  • 金融业务审批流程

    • 如贷款审批、订单审批等,通常需要经过多个审批环节,每个环节都有相应的审批条件和审批人员。
    • 这些审批环节可以看作责任链中的不同节点,依次进行审批,直到审批通过或拒绝。
  • 消息过滤系统

    • 在消息传递系统中,可能需要对消息进行一系列的过滤操作,如过滤垃圾邮件、过滤敏感词汇等。
    • 这些过滤操作可以看作责任链中的不同节点,依次对消息进行过滤,直到消息满足要求或所有过滤器都遍历完。

责任链模式在这些场景中的应用,使得系统的处理流程更加灵活和可扩展。通过动态地添加或删除处理节点,可以轻松地调整系统的处理逻辑,而无需修改现有的代码结构。同时,责任链模式也使得请求的处理过程更加清晰和易于维护。

责任链模式或者设计模式使用的场景有很多,但是,是否适合使用也很关键,不要为了使用而使用,否则也可能会带来更多的bug~~~


http://www.ppmy.cn/ops/137295.html

相关文章

Jupyter Notebook的安装和配置提示功能

Python开发环境搭建conda管理环境-CSDN博客 安装anaconda和对接到编译器的教程可以看上面这一篇 Jupyter Notebook是一种交互式计算环境,它允许用户在单个文档中编写和执行代码、方程、可视化和文本。与其他编译器相比,Jupyter Notebook的突出点在于其交…

自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析

前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间&#xff0c…

react中的useCallback 有什么作用?

在 React 中,useCallback 是一个优化性能的 Hook,主要用于 记忆化(memoization)函数,从而防止在每次渲染时创建新的函数实例。具体来说,useCallback 可以帮助你确保某个函数只会在依赖项发生变化时才会重新…

SPI SRAM串行静态随机存储器

SPI SRAM串行外设接口静态随机存储器,是一种在嵌入式系统中广泛使用的存储解决方案。它以其高速的数据传输速率、低功耗特性以及紧凑的封装形式,成为众多工程师在设计电子设备时的首选。SPI SRAM存储器通过四线制的SPI接口与主控制器连接,包括…

一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单

近日,由 FreeBuf 主办的 FCIS 2024 网络安全创新大会在上海隆重举行。大会现场揭晓了第十届 WitAwards 中国网络安全行业年度评选获奖名单,该评选自 2015 年举办以来一直饱受赞誉,备受关注,评选旨在以最专业的角度和最公正的态度&…

滑动窗口(五)、长度最小的子数组

209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度 。如果不存在符合条件的子数组,返回 0 。 示例 1&…

软件质量保证——软件测试流程

笔记内容及图片整理自XJTUSE “软件质量保证” 课程ppt,仅供学习交流使用,谢谢。 对于软件测试中产品/服务/成果的质量,需要细化到每个质量特性上,因此出现了较为公认的软件质量模型,包括McCall质量模型、ISO/IEC 9126…

使用 Spring AI + Elasticsearch 让 RAG 变得简单

作者:来自 Elastic Laura Trotta 使用私人数据定制你的人工智能聊天机器人体验。 Spring AI 最近将 Elasticsearch 添加为向量存储,Elastic 团队为其提供了优化。我们很高兴展示使用 Spring AI 和 Elasticsearch 向量数据库(vector database&…