技术成神之路:设计模式(八)责任链模式

责任链模式(Chain of Responsibility Pattern):电商平台的订单审批流程实战案例分析 责任链模式提供了一种灵活的方式来组织对象之间的通信,使得对象可以对请求作出响应,而不必知道请求是如何在对象间传递的。 阅读详情

相关文章:技术成神之路:二十三种设计模式(导航页)

介绍

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象依次处理请求,避免请求的发送者和接收者之间的显式耦合。该模式通过将多个可能处理请求的对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

1.定义


责任链模式为请求创建一个接收者对象的链。这种模式给予多个对象处理请求的机会,从而解耦发送者和接收者。

2.主要作用


  1. 解耦发送者和接收者:发送者无需知道链中的具体接收者,只需将请求发送给链的头部。每个接收者只需要实现处理请求的方法即可。

  2. 动态的处理链:责任链可以动态配置和调整,可以根据需要增加或修改链中的处理者,灵活性较高。

  3. 增强可扩展性:可以根据业务需求方便地增加或者修改处理节点,符合开闭原则。

3.解决的问题


空口无凭,咱举例说明😉😉

3.1 解耦发送者和接收者

示例:
在一个电商系统中,订单的支付方式验证可以通过责任链模式来处理。例如,支付方式验证可以依次由信用卡支付、支付宝、微信支付等组成一个处理链,系统根据订单中选择的支付方式逐个验证,直到找到能够处理该支付方式的处理者。

3.2 动态确定处理链

示例:
在一个工作流系统中,根据不同的流程状态和权限要求,可以动态地配置审批流程。例如,一个采购审批流程可能需要在不同金额范围内由不同级别的管理者审批,责任链模式可以根据采购金额动态确定审批人。

3.3 增强系统的可扩展性

示例:
在一个日志记录系统中,可以使用责任链模式来处理日志的级别。例如,如果日志级别是DEBUG,则可以由DebugLogger处理;如果是INFO,则由InfoLogger处理;如果是ERROR,则由ErrorLogger处理。如果未来增加了新的日志级别,只需添加新的处理者即可,不影响原有代码。

4.模式原理


包含角色:

  1. 抽象处理者(Handler):定义处理请求的接口,并维护一个指向下一个处理者的引用。
  2. 具体处理者(ConcreteHandler):实现抽象处理者的接口,处理请求的具体逻辑。如果可以处理请求,则处理;否则将请求传递给下一个处理者。
  3. 客户端(Client):创建责任链,并将请求发送给链的第一个处理者。

UML类图:
在这里插入图片描述
示例代码:

定义处理器接口

abstract class Logger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;

    //next element in chain or responsibility
    protected Logger nextLogger;

    public void setNextLogger(Logger nextLogger){
        this.nextLogger = nextLogger;
    }

    public void logMessage(int level, String message){
        if(this.level <= level){
            write(message);
        }
        if(nextLogger != null){
            nextLogger.logMessage(level, message);
        }
    }

    abstract protected void write(String message);
}

创建具体的处理器

class ConsoleLogger extends Logger {

    public ConsoleLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {        
        System.out.println("Standard Console::Logger: " + message);
    }
}

class ErrorLogger extends Logger {

    public ErrorLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {        
        System.out.println("Error Console::Logger: " + message);
    }
}

class FileLogger extends Logger {

    public FileLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("File::Logger: " + message);
    }
}

设置链条

public class ChainPatternDemo {
    
    private static Logger getChainOfLoggers(){

        Logger errorLogger = new ErrorLogger(Logger.ERROR);
        Logger fileLogger = new FileLogger(Logger.DEBUG);
        Logger consoleLogger = new ConsoleLogger(Logger.INFO);

        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);

        return errorLogger;  
    }

    public static void main(String[] args) {
        Logger loggerChain = getChainOfLoggers();

        loggerChain.logMessage(Logger.INFO, "这是一个信息.");
        loggerChain.logMessage(Logger.DEBUG, "这是一个debug信息.");
        loggerChain.logMessage(Logger.ERROR, "这是一个error信息.");
    }
}

上面代码创建了一个日志处理链:错误日志处理器 -> 文件日志处理器 -> 控制台日志处理器。根据日志消息的级别,消息会被相应级别的处理器处理,如果这个处理器级别不足以处理该消息,则消息会传递给链中的下一个处理器。

5.优缺点


优点:

  • 降低耦合度
  • 增加新的命令处理类很方便

缺点:

  • 不能保证请求一定被接收: 就像switch要加default一样,在链的末端未被处理。
  • 性能问题:如果链条过长可能会出现性能问题,几乎可以忽略。

6.应用场景


  1. 多级请求:当一个请求可以由多个对象来处理,但具体由哪个对象处理则在运行时动态决定。
  2. 审批流程:如公司的采购审批、请假审批等,每个审批阶段都可以视为链上的一个处理节点。
  3. 事件处理系统:如GUI中的事件处理或者框架中的事件传递,比如Java的AWT或Swing。
  4. 日志记录:根据消息的严重性级别决定日志记录的方式,各种处理方式如写入文件、通过电子邮件发送或其他。
  5. 拦截过滤器:网络请求的拦截过滤也可以使用责任链模式设计,例如Servlet的Filter链。
  6. …

7.总结


责任链模式与我们的生活息息相关,比如:项目出了严重BUG 需要找到责任人,测试,开发,项目经理总要有一个来背锅的,还有 村长、乡长、县长、市长… 一级一级的就构成了一条链,可能举例不是很恰当,但大概就是这个意思,这种设计模式提高了系统的灵活性和可扩展性,符合开闭原则和单一职责原则,但也需要注意处理者的配置和性能问题。

JAVA:Spring Boot 实现责任链模式处理订单流程 本文介绍了如何在Spring Boot 3.3中使用责任链模式实现订单流程管理。责任链模式通过将请求沿处理链传递,使订单处理步骤(验证、库存检查、支付、状态更新)解耦,提升代码可维护性。文章详细展示了定义处理器接口、实现具体处理器、配置责任链以及测试的完整流程。通过Spring的依赖注入自动装配处理器链,每个处理器只需关注自身逻辑,最终形成清晰可扩展的订单处理流程。这种模式特别适合具有多个处理步骤且可能变化的业务场景。 阅读详情

相关推荐

修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置

原标题:串口虚拟化 | 串口服务器Nport 5630 设置JZGKCHINA项目改造,客户需要对IFix4.5进行升级,并优化通讯,在不改变原来配置的基础上逐步进行替换。需要将IFix升级到IFix5.9,数据库升级为SQL Server 2016,客户现场使用的智能仪表都是支持Modbus RTU协议的,因原来的手拉手的通讯方式的,当一台仪表掉线后,会影响到其他仪表的通讯,所以此次在不改变原有...

weixin_31688465的博客 2407

优雅!Spring Boot 3.3 实现职责链模式,轻松应对电商订单流程

职责链模式使多个处理对象通过链式关系链接在一起,每个处理对象知道它的下一个处理对象,并且在完成自身处理后,将请求传递给下一个对象。在电商系统中,职责链模式可以将订单处理过程中的各个环节(如库存校验、优惠券核验、支付处理等)封装为独立的处理器,并通过职责链将这些处理器串联起来。每个处理器独立处理其对应的任务,处理完成后将请求传递给下一个处理器,直到所有处理环节完成或者中断。通过职责链模式,我们可以将复杂的订单处理流程解耦成多个独立的步骤,提升了代码的可维护性和扩展性。配置的顺序动态创建处理链。

m0_71190605的博客 1445

Windows11开机必看:3种方法跳过联网激活(含最新OOBE命令)

本文详细介绍了Windows11新机开箱时绕过联网激活的三种实用方法,包括任务管理器终止进程法、命令行强制终止法和最新的OOBE\BYPASSNRO命令法。特别推荐使用微软官方预留的OOBE命令,操作简单且无副作用,帮助用户快速完成系统设置。

weixin_28366353的博客 1623

责任链和命令模式在订单系统的实战记录

责任链和命令模式在订单系统的实战记录 写在前面 “纸上得来终觉浅,绝知此事要躬行”. 读完23种设计模式后,感觉肚子还是空空的,不知道无从下手,今天翻了一下之前的博客,曾经记录过关于Apache Commons Chain的使用,它其实基于责任链,命令模式来写的,它很适合做流程化的逻辑代码,比如订单的下单,支付流程以及退款流程,让代码写的很nice,下面把我应用在订单系统的实战记录下,看下对其他人有没有帮助. 概念 Command接口: 1. 命令模式,实现它来执行责任链中某个节点的业务.

特立独行的猿 1116

Python量化交易实战:从零搭建你的第一个多因子选股模型(附完整代码)

本文是一份详细的Python量化交易入门实战指南,手把手教你从零搭建第一个多因子选股模型。内容涵盖环境配置、数据获取、因子挖掘与有效性检验、多因子合成以及完整的策略回测与绩效评估,并附有可直接运行的完整代码,帮助初学者快速掌握量化交易的基本概念与实践流程。

resnet7explorer的博客 931

SAP 接口测试操作-业务顾问

业务顾问测试接口操作

weixin_43657667的博客 5156

面试官:说说你对责任链模式的理解?应用场景?

一、是什么责任链模式(Chain of Responsibility Pattern)就是某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系将这些对象连成一条链子,并沿...

weixin_44475093的博客 5469

基于 LSTM 的船舶轨迹预测,单步预测

基于 LSTM 的船舶轨迹预测,单步预测

fyuhao的博客 1万+

Java成神路上之设计模式系列教程之一

Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在你的代码里面使用过任何设计模式? 解释下什么是观察者模式? 使用工厂模式最主要的好处是什么?在哪里使用? 等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的...

qfchenjunbo的博客 130

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1055

十九、帧间预测编码_2、解码、显示顺序与图像管理、参考帧管理

一、基本概念 1.1H.264的解码顺序和显示顺序: 解码过程中,每一帧的数据按照相应的NAL Unit在码流中的顺序传入解码器进行解码 由于B帧的存在,视频帧在输出时会进行顺序重排 1.2frame_num与POC frame_num:表示解码顺序 POC:表示显示顺序(picture_order_count) 在H.264的码流中,表示解码顺序和显示顺序分别有相应的语法元素表示。这两个值都会在码流中保存,并在读取slice信息时解析(SliceHeader中) 1.3参考帧列表 某一帧图像在解

叮咚的博客 1328

【Netty 从成神到升仙系列 五】Netty 的责任链真有这么神奇吗?

大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,Java领域新星创作者。这是我的系列专栏:Netty 从成神到升仙。如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步。如果感觉博主的文章还不错的话,请三连支持一下博主哦。

爱敲代码的小黄 1393

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

1. 设置目标原件时,选择切换,这样就可以实现,当原件展示时,点击自动隐藏,隐藏时自动显示; 2. 展开/收起原件(推动/拉动原件)设置为方向**向下**

专注于计算机研发知识和资讯分享 1376

技术成神之路:二十三种设计模式(导航页)

设计原则/模式 链接 面向对象的六大设计原则 技术成神之路:面向对象的六大设计原则 创建型模式 单例模式 建造者模式 原型模式 工厂方法模式 抽象工厂模式 行为型模式 策略模式 状态模式 责任链模式 观察者模式 备忘录模式 迭代器模式 模板方法模式 访问者模式 结构型模式 享元模式 中介者模式 代理模式 组合模式 适配器模式 桥接模式 装饰模式 外观

WriteBug001的博客 587

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CMap分子指纹搜索引擎:从基因表达向量到药物重定位

CMap(Connectivity Map)是一种基于基因表达谱的高维生物信息检索系统,其核心是将化合物转化为978个标志性基因的z-score向量,通过线性代数运算(如加权余弦相似度)实现跨扰动条件的生物学关联匹配。它不依赖SQL或传统数据库架构,而是以HDF5张量格式存储、以L1000平台标准化数据为基石,支撑药物重定位、通路机制解析与多组学验证等关键科研任务。作为药理学与计算生物学交叉的典型范式,CMap已成为小分子功能注释、老药新用发现及单细胞数据解读的重要基础设施,广泛应用于抗纤维化、抗肿瘤及炎症

weixin_34411563的博客 405

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

gpio的8种工作模式_Java成神路上之设计模式系列教程之一

Java成神路上之设计模式系列教程之一千锋-Feri在Java工程师的日常中,是否遇到过如下问题:Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式?什么是设计模式?你是否在你的代码里面使用过任何设计模式?解释下什么是观察者模式?使用工厂模式最主要的好处是什么?在哪里使用?等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的日常开发中充当什么样的作用?...

weixin_39739404的博客 102

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

夜光带你走进 Java 成神之路(三十四)擅长的领域

夜光序言: 我们随时都可以撤。我们始终忠于自己的内心。尝试就是最好的结果。 正文: 以道御术 / 以术识道 下面,我们看看状态模式 下面我们介绍职责链模式 p...

夜光的博客 213

教你快速学会设计模式

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版) ②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版) ③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版) ④【Web前端】从HT...

黑技的博客 427

耗时两月!20+真实案例场景、近300页、18W字,这份【Java设计模式实践指南】已然成神,堪称经典

什么是设计模式?这个问题我问过的面试者不下于数十次,回答五花八门。 在我看来,模式就是经验,设计模式就是设计经验,有了这些经验,我们就能在特定情况下使用特定的设计、组合设计,这样可以大大节省我们的设计时间,提高工作效率。 作为一个工作已久的老码农,经历的系统架构设计也算不少,接下来,我会把工作中用到的一些架构方面的设计模式总结成了一个文档分享给大家,望大家少走弯路。 创建者模式(五种) 工厂方法模式 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象

资料免费分享,点击名片 391

舒服!阿里P9架构师熬夜梳理的2020版Java成神之路指南

1.计算机基础: 1.1数据结构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉。 5.树的前中后,层次,之字,最短路。 6.KMP等字符串算法。 1.2操作系统: 主要学习: 1.进程,线程,进程线程区别。进程间通信 2.进程调度算法理解 3.存储,虚拟内存,分页分段,内存调度算法 4.文件系统,链式,索引 5.死锁:原因,避免,解除k 6.Linux基本操作命令,会一门脚本编程:s

weixin_47531845的博客 214

完美!Alibaba架构师团队熬夜梳理的2021版Java成神之路指南

1.计算机基础: 1.1数据结构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉。 5.树的前中后,层次,之字,最短路。 6.KMP等字符串算法。 1.2操作系统: 主要学习: 1.进程,线程,进程线程区别。进程间通信 2.进程调度算法理解 3.存储,虚拟内存,分页分段,内存调度算法 4.文件系统,链式,索引 5.死锁:原因,避免,解除k 6.Linux基本操作命令,会一门脚本编程:s

文章中资料均可获取,有需要请添加yunduoa2019即可 169

2021最新版Java成神之路指南,竟出自阿里P9大牛之手

1.计算机基础: 1.1数据结构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉。 5.树的前中后,层次,之字,最短路。 6.KMP等字符串算法。 1.2操作系统: 主要学习: 1.进程,线程,进程线程区别。进程间通信 2.进程调度算法理解 3.存储,虚拟内存,分页分段,内存调度算法 4.文件系统,链式,索引 5.死锁:原因,避免,解除k 6.Linux基本操作命令,会一门脚本编程:s

文章中资料均可获取,有需要请添加yunduoa2019即可 246
上一篇: 技术成神之路:设计模式(七)状态模式
下一篇: 技术成神之路:设计模式(九)观察者模式
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值