什么是责任链模式?有哪些应用?

ops/2024/9/24 12:18:49/

一、定义、目的

责任链模式的目的是避免请求发送者与多个接收者之间的耦合关系,将这些接收者组成一条链,并沿着这条链传递请求,直到有一个接收者处理它为止。

责任链模式中,通常将处理请求的对象称为处理器或者链的节点,每个节点都包含了处理该请求的逻辑以及指向下一个节点的引用。当请求到达一个节点时,如果该节点无法处理该请求,它会将请求转发给下一个节点,直到有一个节点处理该请求或者整个链都无法处理该请求。

二、应用场景:

责任链模式在实际开发中有很多应用场景,比如:
1、过滤器链:在Web开发中,可以通过责任链模式来实现过滤器链,例如Spring框架中FilterChain就是一条责任链,每个过滤器都有机会对请求进行处理,直到最后一个过滤器处理完毕。
2、日志记录器:在日志系统中,可以使用责任链模式来将日志记录器组成一条链,从而实现多种日志记录方式的灵活组合。
3、异常处理器:在应用程序中,可以使用责任链模式来实现异常处理器的链式调用,从而灵活地处理各种异常情况。
4、授权认证:在系统中,可以使用责任链模式来实现授权认证的链式调用,从而灵活地控制不同用户对系统的访问权限。

三、示例

下面以一个订单处理的场景为例,介绍如何使用责任链模式:
假设我们有一个在线商店,当用户下单时,订单需要经过以下几个步骤:
1、检查订单信息是否完整
2、检查商品库存是否充足
3、检查用户余额是否充足
4、确认订单,更新商品库存和用户余额
我们可以将每个步骤封装成一个处理者,然后使用责任链模式将它们连接起来,形成一个处理链。
首先定义一个处理者接口OrderHandler:

public interface OrderHandler{void handle(Order order);
}

然后实现每个步骤对应的Handler:

public class CheckOrderHandler implements OrderHandler {private OrderHandler next ;public CheckOrderHandler (OrderHandler next) {this.next = next ;}@Overridepublic void handle(Order order) {//检查订单信息是否完整if (order.isInfoComplete()) {//如果订单信息完整,则将请求传递给下一一个处理者next.handle(order) ;} else {//如果订单信息不完整,则直接返回错误信息throw new RuntimeException( "订单信息不完整") ;}}}
public class CheckStockHandler implements OrderHandler {private OrderHandler next ;public CheckStockHandler (OrderHandler next) {this.next = next ;}@Overridepublic void handle(Order order) {//检查商品库存是否充足if (order.getStock() >= order.getQuantity()) {//如果库存充足,则将请求传递给下一个处理者next.handle( order ) ;} else{//如果库存不足,则直接返回错误信息throw new RuntimeException( "商品库存不足") ;}}
}public class CheckBalanceHandler implements OrderHandler {private OrderHandler next ;public CheckBalanceHandler (OrderHandler next) {this.next = next ;}@Overridepublic void handle(Order order) {//检查用户余额是否充足if (order.getBalance() >= order. get Amount() ) {//如果余额充足,则将请求传递给下一个处理者next.handle( order ) ;} else {//如果余额不足,则直接返回错误信息throw new RuntimeException( "用户余额不足") ;}}
}
public class Confi rmOrderHandler implements OrderHandler {@Overridepublic void handle(Order order) {// 确认订单,更新商品库存和用户余额order.confirm( ) ;}
}

其中每个处理者都有一个指向下一个处理者的引用,处理者之间通过调用下一个处理者的handle方法将请求传递下去。如果某个处理者无法处理请求,则直接返回错误信息。最后,再将这些Handler串联起来按顺序执行即可。

//客户端代码示例
CheckOrderHandler checkOrderHandler = new CheckOrderHandler();
CheckStockHandler checkStockHandler = new CheckStockHandler();
CheckBalanceHandler checkBalanceHandler = new CheckBalanceHandler();
ConfirmOrderHandler confirmOrderHandler = new ConfirmOrderHandler();// 将处理器按照一定顺序组成责任链
checkOrderHandler.setNext (checkStockHandler) ;
checkStockHandler.setNext (checkBalanceHandler) ;
check BalanceHandler.setNext (confirmOrderHandler) ;//处理订单
Order order = new Order( ) ;
checkOrderHandler.handle(order) ;


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

相关文章

GitOps介绍

基础设施即代码 IaC 在理解 GitOps 之前,需要先理解什么是基础设施即代码。 基础设施即代码(Infrastructure as Code,简称IaC)是一种软件工程实践,它将基础设施的管理和配置过程像管理代码一样进行版本控制、自动化和…

Git的下载与安装

一、下载、安装Git 官网下载地址: 选择版本时需要先确认电脑是多少位操作系统。桌面右键点击“此电脑”,点击“属性”。 可以看到当前电脑是windows10 64系统系统,所以我需要下载Git 64bit版本(如果是32位系统要下载32bit版本)。 安装 点击…

java识别word段落和Java识别pdf端口整理

首先理解word与xml的关系 word文档与xml关系_docx xml-CSDN博客 Word和XML之间有密切的关系,因为Word文档实际上是XML文件的一种。从Word 2003开始,Microsoft Word文档的默认格式是XML,即.docx。XML是一种可扩展的标记语言,它允…

Avi Wigderson获得2023年图灵奖(Turing Award)

2024年4月10日,美国计算机协会(ACM)宣布将2023年图灵奖(ACM A.M. Turing Award)授予普林斯顿高等研究院教授Avi Wigderson,以表彰他对计算理论的基础性贡献,包括重塑人类对计算中随机性作用的理…

大模型微调实战之强化学习 贝尔曼方程及价值函数(一)

大模型微调实战之强化学习 贝尔曼方程及价值函数 强化学习(RL)是机器学习中一个话题,不仅在人工智能方面。它解决问题的方式与人类类似,我们每天都在学习并在生活中变得更好。 作为一名大模型学习者,当开始深入研究强…

C语言 | Leetcode C语言题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; int mySqrt(int x) {long int i 0;for(i0;;i){long int a i*i;long int b (i1)*(i1);if(a < x&&b > x){break;}}return i; }

FTTR(光猫)ITMS注册NCE纳管

ITMS注册 TR069交互过程&#xff1a; 1.1. TR069交互—主动连接机制 主动连接机制是指CPE主动发出请求连接事件(事件可以为&#xff1a; 0 BOOTSTRAP&#xff1b; 1 BOOT; PERIODIC等等)给ACS。在连接建立之后才能进行业务处理(通过调用RPC方法实现)。 备注&#xff1a;政企…

【iOS】事件传递与响应机制

文章目录 前言事件UIEvent一、事件传递遍历顺序 二、手势识别三、响应机制UIResponder&#xff08;响应者&#xff09;响应者链 四、相关应用扩大button点击范围穿透事件 总结 前言 提到响应者链与事件传递&#xff0c;如果看过其他人的博客&#xff0c;经常能看到这经典的三张…