带你认识设计模式的【责任链模式】及优缺点

设计模式-责任链模式 责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式。这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点。 阅读详情

前言

责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式。

这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点。

应用场景

首先举一个日常的例子,比如我们申请开发票,首先我们要写好报销单,首先要你的部门领导审批,部门领导审批不通过直接打回,审批通过再由公司的总经理审批这里审批通过才算成审批完成。这种情况就很适合使用责任链模式。

总结一下责任链主要适用一下几种情况:

  1. 多个对象可以处理同一个请求,但是具体由那个对象处理完成则在运行时决定。

  2. 不明确指定接收者的情况下,向多个对象中的一个提交一个请求

可以看一下责任链模式的通用UML类图:

​通过类图可以看到总共包含以下角色:

  • 抽象处理者:主要是定义处理请求的方法以及维护下一个处理结点的对象的引用

  • 具体处理者:处理的具体实现

责任链的精髓在于将很多处理节点行成个链式结构,并允许结点自身决定是否进行处理或者转发。

实际代码案例

下面举一个我们在开发时经常会遇到的一种情况:登录 比如我们开发一个管理系统在登录的时候往往我们会先判断客户端传递的账号及密码是否为空但凡有一个是空肯定是不能继续往下走的,然后就是根据用户账号密码拿到用户的所有信息,如果能拿到继续周下一步,拿不到则是报错提示用户不存在,到下一步又会判断当前用户的权限。

无模式情况下的代码

private String login(String username,String password) { if(username == null || password == null) { return "账户或者密码为null"; } User user = queryUserInfo(username, password); if(user == null) { return "找不到用户"; } if(!Objects.equals(user.getRoleName(), "超管")){ return "没有权限"; } return "登录成功"; } private User queryUserInfo(String username,String password){ if(Objects.equals(username, "土豆") && Objects.equals(password, "666666")) { return new User(username,password,"超管"); }else if(Objects.equals(username, "土豆2号") && Objects.equals(password, "666666")){ return new User(username,password,"普通员工"); } return null; } 复制代码

发现判断代码都冗余在一个方法里面,后续改动修改都需要修改中这个方法不满足开闭原则。

采用责任链模式优化代码

首先创建抽象类规定抽象方法以及维护下一个节点

public abstract class Handler { protected Handler next; public void setNext(Handler next) { this.next = next; } public abstract void doHandler(User user); } 复制代码

然后就是创建多个实现逻辑的节点对象:

public class ValidatedHandler extends Handler { @Override public void doHandler(User user) { if(user.getUsername() == null || user.getPassword() == null) { System.out.println("账户或者密码为null"); }else{ this.next.doHandler(user); } } } 复制代码
public class UserHandler extends Handler{ @Override public void doHandler(User user) { queryUserInfo(user); if(user.getRoleName() == null){ System.out.println("没有找到用户"); }else{ this.next.doHandler(user); } } private static void queryUserInfo(User user){ if(Objects.equals(user.getUsername(), "土豆") && Objects.equals(user.getPassword(), "666666")) { user.setRoleName("超管"); }else if(Objects.equals(user.getUsername(), "土豆2号") && Objects.equals(user.getPassword(), "666666")){ user.setRoleName("普通员工"); } } } 复制代码
public class AuthHandler extends Handler{ @Override public void doHandler(User user) { if(!Objects.equals(user.getRoleName(), "超管")){ System.out.println("没有权限"); } System.out.println("登入成功"); } } 复制代码

最后调用:

public static void main(String[] args) { User user = new User("土豆","666666"); Handler validatedHandler = new ValidatedHandler(); Handler userHandler = new UserHandler(); Handler authHandler = new AuthHandler(); validatedHandler.setNext(userHandler); userHandler.setNext(authHandler); validatedHandler.doHandler(user); } 复制代码

可以看一下UML类图:

​

采用建造者+责任链模式优化代码

上述的代码发现维护链表的操作在用户调用的那一层,链表的组装过于复杂,这个时候我们可以使用建造者模式, 自动维护链表的组装,调用者只需要指定链表的顺序即可 主要修改Handler内代码:

public abstract class Handler { protected Handler next; public void setNext(Handler next) { this.next = next; } public abstract void doHandler(User user); public static class Builder { private Handler head; private Handler tail; public Builder addHandler(Handler handler) { if(this.head == null){ this.head = this.tail = handler; return this; } this.tail.setNext(handler); this.tail = handler; return this; } public Handler build() { return this.head; } } } 复制代码
Handler.Builder builder = new Handler.Builder(); builder.addHandler(new ValidatedHandler()) .addHandler(new UserHandler()) .addHandler(new AuthHandler()); builder.build().doHandler(user); 复制代码

可发现调用者只需要关心链表顺序写入就好

责任链模式优缺点

优点:

  1. 请求与处理解耦

  2. 处理者只需要关心自己的处理逻辑即可,如果不是自己的直接转发

  3. 具有链式传递功能,请求者不需要关系链路结构等待结果就好

  4. 易于维护,可以很灵活的修改链路的结构新增或者删除,符合开闭原则

缺点:

  1. 会出现循环引用的情况

  2. 责任链太长会影响性能

责任链设计模式 责任链设计模式,就是一个链。。。 我也是参照着网上大部分说的案例来学习的,再复述一遍: 假如我要请假,公司规定不超过3天,TL审批即可;3天到6天之内,这是公司的规定,我们假如员工不知道这个规定,那责任链设计模式就是说: 我在请假的时候,我只需要按照我想请假的天数提交申请,至于是TL审批?还是TL的TL审批?还是大boss审批?对于提交请假申请的人,就不需要关系 因为在这个场景中,TL、TL的TL、大boss这三者是在一个责任链上的,他们三个人都可以来处理请假请求,对于请假人,只需要提交申请,如果责任链中的 阅读详情

相关推荐

Java设计模式之<责任链模式>

本文介绍了责任链模式的概念、实现及应用场景。责任链模式是一种行为型设计模式,通过将请求沿处理链传递,直到被某个对象处理。其核心思想是解耦请求发送者和接收者,支持动态组合处理链,适用于多级处理场景。文章详细说明了该模式的优缺点,并通过Java代码示例展示了具体实现方式。此外,还列举了SpringMVC、MyBatis、Spring拦截器等多个框架中的实际应用案例,最后以学校采购审批流程为例,完整演示了责任链模式的具体实现过程。该模式能有效分离职责,提高系统灵活性。

weixin_50055999的博客 1491

责任链模式及其使用场景

责任链模式及其使用场景1.责任链模式定义2. 责任链模式使用场景3. 责任链模式实现3.1 简单实现3.2 扩展实现4. 责任链模式实战5. 总结 1.责任链模式定义 责任链模式(Iterator Pattern), 是行为型设计模式之一。这种模型结构有点类似现实生活中铁链,由一个个铁环首尾相接构成一条链,如果这种结构用在编程领域,则每个节点可以看做一个对象,每个对象有不同的处理逻辑,将一个请求从...

虎哥LoveDroid 2万+

深入解析设计模式之责任链模式

责任链模式(Chain of Responsibility)是一种行为设计模式,它允许多个对象处理一个请求,从而将请求的发送者和接收者解耦。在责任链中,一个请求沿着链上的对象传播,直到链上的某个对象处理它为止。责任链模式鼓励将请求的发送者和处理者分离。这种模式的好处是可以动态地修改和组合处理者链,允许定义不同的处理者角色,并在运行时动态地添加或移除。理解责任链模式的基本概念和结构对于应用这一模式至关重要。

weixin_31641077的博客 831

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

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

weixin_44475093的博客 5469

Autodesk软件网络授权破解

Autodesk 全系列产品网络授权破解 此网络许可授权破解文件及方法适用Autodesk 绝大部分的产品, 安装网络许可证管理器Autodesk网络许可证管理器x64位官方下载地址( https://knowledge.autodesk.com/sites/default/files/file_downloads/nlm11.14.1.3_ipv4_ipv6_win64.msi ) Autod...

weixin_33919950的博客 8270

用Python玩转LQR控制:3行核心代码实现倒立摆稳定控制(附Jupyter Notebook)

本文通过Python实战演示了如何使用LQR算法实现倒立摆的稳定控制。文章以直观方式解释LQR原理,提供从系统建模、核心代码求解到参数调优的完整流程,并附有可运行的Jupyter Notebook代码。重点介绍了如何利用SciPy库快速计算最优反馈增益,并通过仿真验证控制效果,为运动控制实践提供了即学即用的指南。

weixin_29311017的博客 83

【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)

讲解责任链模式的思想,介绍其常见的应用场景,举例说明其实现方式

我只管埋头前行,剩下的交给时间。 3642

Cadence 17.2 OrCAD原理图库实战:从零创建电阻/电容/LED元件(附封装技巧)

本文以Cadence 17.2 OrCAD为核心,详细讲解了如何从零开始工程化地创建电阻、电容、LED等原理图库元件。内容涵盖库架构设计、符号绘制、引脚属性管理、封装关联技巧以及设计规则检查,旨在帮助硬件工程师构建规范、可复用且易于维护的元件库,为高效PCB设计奠定坚实基础。

weixin_29195615的博客 402

【西瓜带你学设计模式 | 第十七期 - 责任链模式】责任链模式 —— 链式审批处理实现、优缺点与适用场景

本文讲解了责任链模式将多个处理器串联成链,请求沿链传递并由合适节点处理,解耦请求发送方与处理方,支持动态编排流程,广泛应用于审批、过滤器等场景。

无籽西瓜a的博客 416

从Starlink看NTN:SSB波束数量少,用户体验真的会差吗?

当SpaceX的Starlink以每月新增上百颗卫星的速度扩张其星座时,一个有趣的技术现象正在引发行业讨论:为何这个全球最大的低轨卫星网络选择使用相对较少的波束数量?波束数量的选择远非简单的技术参数,而是系统设计哲学、商业策略与终端用户体验的复杂平衡。传统地面网络可以依赖密集基站实现精准覆盖,而卫星通信必须面对一个根本性挑战:如何在数百公里的高空,用有限的射频资源服务广阔的地理区域。当我们在撒哈拉沙漠测试不同波束方案时,发现了一个关键洞见:最佳波束数量不是固定的技术参数,而是随网络发展阶段变化的动态值。

weixin_32308101的博客 335

Java云上香云祭祀线上祭祀系统小程序源码

云上香云祭祀线上祭祀系统”,不仅是一种祭祀方式的创新,更是对传统文化的一次深情致敬。它让我们明白,无论时代如何变迁,对亲人的怀念与尊重永远不会改变。在这个特别的平台上,让我们共同守护那份跨越时空的爱与思念,让心灵得以安放,让生命之树常青。🌳。

2401_84413757的博客 806

重学设计模式-责任链模式

责任链模式又称为职责链模式,其核心思想是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链。当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。在这种模式下,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,因此责任链将请求的发送者和请求的处理者解耦了。责任链模式属于对象行为型模式,它主要由以下几个角色组成:抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

m0_73629745的博客 1289

Unreal使用nDisplay制作裸眼3D(9宫格)

摘要: nDisplay是虚幻引擎的分布式实时渲染技术,可将内容同步输出到多个显示设备(如LED墙、投影仪等),构建沉浸式可视化系统。其核心功能包括:分布式渲染(支持多台设备协同处理高分辨率内容)、空间透视校正(通过追踪观众动态调整画面几何关系)以及虚拟拍摄应用。配置时需设置集群组件(Cluster、Host、Node、Viewport)定义渲染逻辑,空间组件(nDisplayScreen、ViewPoint)确定投影关系。文中以9宫格配置为例,详细演示了从工程创建到影片渲染合成的全流程,最终通过多视口合成

TxNet 609

Java设计模式:责任链模式

责任链模式(Chain of Responsibility)又名职责链模式,是一种行为设计模式,它允许你构建一个由多个对象组成的链,每个对象都有机会处理请求,或者将请求传递给链中的下一个对象。这种模式常用于处理请求的对象之间存在层次关系的情况。责任链模式的主要目的是解耦发送者和接收者,使多个对象都有机会处理请求,而不是将请求发送者与接收者硬编码在一起。在责任链模式中,每个处理者都包含一个对下一个处理者的引用,形成一个链条。当请求进入链条时,从链条的头部开始逐个处理,直到找到能够处理该请求的对象为止。

Java技术一点通 5481

Imagenet数据集1000类别中英文

英文 {0: 'tench, Tinca tinca', 1: 'goldfish, Carassius auratus', 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', 3: 'tiger shark, Galeocerdo cuvieri', 4: 'hammerhead, hammerhead shark', 5: 'electric ray, cram.

识物专栏 1800

基于滤波反投影的图像重建算法matlab仿真

基于滤波反投影的图像重建算法是一种用于医学影像重建的计算机辅助技术。该算法可以从投影数据中重建出高质量的三维图像,被广泛应用于医学影像学、CT、PET等领域。本文将详细介绍基于滤波反投影的图像重建算法的原理、步骤和应用。一、原理介绍基于滤波反投影的图像重建算法基于X射线CT成像原理,它的主要思想是通过对投影数据进行处理,反推出被成像物体的三维形状。其核心原理是投影数据与目标物体之间的线性关系,即通过估计目标物体的吸收率来计算投影数据的变化,从而反推出目标物体的三维形状。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 386

设计模式之责任链模式

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。当请求到达链中的某个处理者时,该处理者会决定是处理这个请求还是将其传递给链中的下一个处理者。这样就形成了一条责任链,请求在这条链上依次传递,直到有一个处理者能够处理它为止。

FallingGod的博客 1323

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

设计模式学习,责任链设计模式,责任链设计模式使用场景、优缺点,代码示例

github_38727595的博客 1982

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

《程序猿之设计模式实战 · 责任链模式》

本篇文章继续介绍一下责任链模式,这个在日常工作中使用较为频繁,责任链模式可以带给我们什么?SpringMVC的拦截器是否使用了责任链模式呢?让我们一探究竟。《程序猿之设计模式实战 · 策略模式》《程序猿之设计模式实战 · 装饰者模式》《程序猿之设计模式实战 · 池化思想》《程序猿之设计模式实战 · 观察者模式》1、责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求的发送者和接收者解耦。

山人行 1399

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式 - 责任链模式

责任链模式?嗯哼… if else ?so easy 啊 ~ 在我认为常用的if else处理就是责任链简化的一种形式,开发中还是用if else 多一些,架构级别可能用责任链模式更多一些 ~ 基础概念个人理解使用场景角色划分优缺点优点缺点基础实现Demo - 思想Demo - 效果if else 方式责任链方式抽象处理者具体处理者 A具体处理者 B场景类 基础概念 在此模式中客户(场景类)只负责将请求发送到责任链,无需关心请求的处理与传递过程,从而将请求的发送者和请求的处理者进行解耦 个人理解 在我学完

Android、前端、小程序、后端 3356

设计模式:责任链模式

摘要:责任链模式通过将请求发送者与接收者解耦,使多个对象能依次处理请求。文章以请假审批为例,说明该模式的应用场景,区分纯(单处理器处理)与不纯(多处理器协作)两种实现方式,并通过文本处理(去除空格+转大写)的代码示例展示具体实现。分析其优点(灵活扩展、符合开闭原则)与缺点(可能遗漏处理、性能损耗),最终强调该模式在流水线式请求处理中的价值。全文约150字。

记录代码路上的点滴思考。 671

设计模式——责任链模式

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

m0_66825548的博客 1632

重学Java设计模式-责任链模式

在软件开发中,设计模式是解决特定问题的成熟模板,它们提供了一种标准的方式来解决常见的软件设计问题。责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。责任链模式是一种对象行为型模式,它包含多个对象,每个对象都包含对下一个对象的引用,构成一条链。请求在这个链上传递,每个对象都可以选择处理请求或者传递给下一个处理者,甚至停止传递请求直接返回。责任链模式定义了一种使多个对象都有机会处理请求的机制,从而解耦请求的发送者和接收者。

海贼王路飞的博客 1234

23种设计模式之责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在解决请求发送者和接收者之间的耦合问题。通过将多个对象连接成一条链,请求沿着这条链传递,直到某个对象决定处理该请求为止。这种模式允许系统动态地重新组织和分配责任,而不会影响客户端。

weixin_51395608的博客 1682

「设计模式」责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

frozenpenguin的博客 2064
上一篇: 8000字让你知道NoSQL是什么
下一篇: 带你认识设计模式的【策略模式】及优缺点
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值