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

embedded/2024/11/28 8:08:24/

责任链模式的基本概念

定义责任链模式(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/embedded/141141.html

相关文章

详解PyTorch中的Sequential容器:构建与优化简单卷积神经网络

详解PyTorch中的Sequential容器:构建与优化简单卷积神经网络 Sequential 是 PyTorch 中的一个容器模块,它按照在构造函数中添加它们的顺序来组织多个子模块(通常是网络层)。Sequential 容器允许用户快速串联多个模块,…

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce 我们来分析一下这个代码: 首先是isset看我们有没有传一个为空的值,如果为空就输出居然都不输入参数,可恶!!!!!!!!!不为空就GET传参赋值给$code ,接着 如果 $code 中不包含这些模式中的任何一个&#x…

git merge 排除文件

方法一: 在Git中,如果你想在合并时排除特定文件,你可以使用.gitattributes文件来指定合并策略。你可以设置一个自定义合并策略来忽略特定文件的合并。 首先,在仓库的根目录下创建或编辑.gitattributes文件,并添加以…

MySQL底层概述—4.InnoDB数据文件

大纲 1.表空间文件结构 (1)表空间Tablesapce (2)段Segment (3)区Extend (4)页Page (5)行Row 2.Page结构 (1)页结构各部分说明 (2)页结构整体划分 3.行记录格式 (1)行格式分类 (2)COMPACT行记录格式 (3)Compact中的行溢出机制 (4)其他行格式记录 1.表空间文件结构…

设计模式:12、中介者模式

目录 0、定义 1、中介者模式的四种角色 2、中介者模式的UML类图 3、示例代码 0、定义 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。 1、中介者模式的四种角色 …

C++ 类和对象(初始化列表)

目录 一、前言 二、正文 1.初始化列表 1.1初始化的格式 1.2初始化列表的使用 1.2.1引用成员变量初始化 1.2.2const成员变量 1.2.3没有默认构造函数的成员变量必须在初始化列表初始化 2.成员变量声明处给缺省值 一、前言 前面我们已经用所学知识运算符重载写了一个日期计…

Javaweb 前端 HTML css 案例 总结

顶部导航栏 弹性布局 搜索表单区域 表单标签 表单标签,表单项 复选,一次选多个 隐藏域,看不到,但会传参数 text输入框 radio单选 男女,是 前端页面上显示的值 搜索表单区域 button 按钮 表格数据展示区域 fo…

PHP 超级全局变量

超级全局变量是指在php任意脚本下都可以使用 PHP 超级全局变量列表: $GLOBALS:是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。 $_SERVER:$_SERVER 是一个PHP内置的超级全局变量,它是一个包含了诸如头信息(header)、路…