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

一、定义、目的

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

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

二、应用场景:

责任链模式在实际开发中有很多应用场景,比如:
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 ;
    }
    @Override
    public 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 ;
    }
    @Override
    public 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 ;
    }
    @Override
    public void handle(Order order) {
        //检查用户余额是否充足
        if (order.getBalance() >= order. get Amount() ) {
            //如果余额充足,则将请求传递给下一个处理者
            next.handle( order ) ;
        } else {
            //如果余额不足,则直接返回错误信息
            throw new RuntimeException( "用户余额不足") ;
        }
    }
}
public class Confi rmOrderHandler implements OrderHandler {
        @Override
        public 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.mfbz.cn/a/593270.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习和“劳动”相关的谚语,柯桥俄语培训

1. Бог труды́ лю́бит. 天道酬勤。 2. В ми́ре нет тру́дных дел, ну́жно лишь усе́рдие. 世上无难事,只怕有心人。 3. У́тро вечера мудренее. 一日之计在于晨。 4. Что посе́ешь,…

车载电子电器架构 —— 关于bus off汇总

车载电子电器架构 —— 关于bus off汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

[Java EE] 多线程(六):线程池与定时器

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

语义分割——铁路轨道数据集

引言 亲爱的读者们,您是否在寻找某个特定数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 重…

NASA数据集——NOAA 气溶胶和海洋科学考察数据(AEROSE)

Saharan Dust AERosols and Ocean Science Expeditions 简介 NOAA 气溶胶和海洋科学考察(AEROSE)是一种基于测量的综合方法,用于了解热带海洋上空气溶胶长程飘移的影响(Morris 等人,2006 年;Nalli 等人&a…

直流屏整流模块HG07A220R电源模块HG10A220R

直流屏整流模块HG07A220R电源模块HG10A220R 其他同类型监控模块PM09T电源模块HG22005/S,HG22010/S,HG11010/S,HG11020/S,HG10A220Z,HG10A220F,HG05A220Z,HG07A220Z,HG10A110Z&#x…

Electron 对 SQLite 进行加密

上一篇讲了如何在 Electron使用 SQLite,如果 SQLite 中存有敏感数据,客户端采用明文存储风险很高,为了保护客户数据,就需要对数据进行加密,由于 electron 对代码并不加密,所以这里排除通过逆向工程进行数据…

从论文中看AI绘画

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 主要看是看Diffusion Models,CLIP,ControlNet,IP-Adapter这种经典论文,尝试总结论文写作的一些方式以及图像生成模型的一些内在思想. 对于其中的数学原理和代码不过深究. DDPM 使用扩散模型得到高质量图像,证明了这…

三、Linux基础命令

章节目标 了解Linux系统注意事项掌握Linux基础命令知道vmware tools的作用 一、Linux系统使用注意 1. Linux严格区分大小写 Linux 和Windows不同,Linux严格区分大小写的,包括文件名和目录名、命令、命令选项、配置文件设置选项等。例如,在…

5.3 调制与解调

信号的调制与解调是通信系统中一对基本的概念,涉及将信息(语音、视频、数据等)在发送之前进行处理以便在传输介质(如无线电波、电话线等)上有效传输,以及在接收端恢复这些信息的过程。 一、调制&#xff0…

Leetcode—289. 生命游戏【中等】

2024每日刷题&#xff08;126&#xff09; Leetcode—289. 生命游戏 算法思想 实现代码 class Solution { public:void gameOfLife(vector<vector<int>>& board) {int rows board.size();int cols board[0].size();int neighbors[3] {0, 1, -1};vector<…

spring框架学习记录(2)

文章目录 注解开发bean相关注解开发定义bean纯注解开发纯注解开发中bean的管理 依赖注入相关依赖注入第三方bean管理第三方bean依赖注入 AOP(Aspect Oriented Programming)面向切面编程AOP简介AOP核心概念AOP工作流程AOP切入点表达式通知类型AOP通知获取数据 注解开发 bean相关…

Day19 代码随想录打卡|字符串篇---反转字符串II

题目&#xff08;leecode T541&#xff09;&#xff1a; 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小…

OceanBase 轻量级数仓关键技术解读

码到三十五 &#xff1a; 个人主页 为了更好地聚合和治理跨域数据&#xff0c;帮助企业用较低的成本快速聚合分析&#xff0c;快速决策&#xff0c;不断的让企业积累的数据产生价值&#xff0c;从全域海量数据抓取&#xff0c;高性能流批处理&#xff0c;元数据血缘治理等等方面…

数据分析从入门到精通 1.numpy 剑客修炼

会在某一瞬间突然明白&#xff0c;有些牢笼是自己给自己的 —— 24.5.5 一、数据分析秘笈介绍 1.什么是数据分析 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来&#xff0c;总结出所研究对象的内在规律。使得数据的价值最大化 案例&#xff1a; 分析用户的消…

Kotlin: Expecting a ‘>‘

数组值为任意类型&#xff0c;声明报错: Kotlin: Expecting a > var anyArr1: Array<Any?> arrayOf("a", "b", "c", true, 34)原因是&#xff1a; // var anyArr1: Array<Any?> arrayOf("a", "b", "c…

概念解析 | 威胁建模与DREAD评估:构建安全的系统防线

注1:本文系"概念解析"系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:威胁建模和DREAD模型 概念解析 | 威胁建模与DREAD评估:构建安全的系统防线 What Is Threat Modeling? Definition, Process, Examples, and Best Practices - Spic…

蓝桥杯-路径之谜

题目描述 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。城堡里面什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡的地面时n*n个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或者纵向移动&#xff0c;但是不能斜着走&#x…

SpringBoot自定义定时任务

通常&#xff0c;在我们的项目中需要定时给前台发送一些提示性消息或者我们想要的定时信息&#xff0c;这个时候就需要使用定时任务来实现这一功能&#xff0c;实现也很简单&#xff0c;接下来具体来看看吧~ 简单定时任务 首先&#xff0c;你需要在你的启动类上加上开启定时任…

贪吃蛇(下)游戏的实现

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 &#xff08;善后工作&#xff09;四.游戏的测…
最新文章