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

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

本文介绍了责任链模式,它是一种行为型设计模式,允许多个对象按顺序处理请求。文中阐述了其基本概念、使用场景、优缺点,并给出Java代码示例。还列举了该模式在用户登录验证、请求处理系统等场景的应用,强调使用时要考虑是否合适。

责任链模式的基本概念

定义:责任链模式(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 {
    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public 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 处理请求: A
        handlerA.handleRequest("B"); // ConcreteHandlerB 处理请求: B
        handlerA.handleRequest("C"); // ConcreteHandlerC 处理请求: C
        handlerA.handleRequest("D"); // 无处理者处理请求: D(请求被忽略)
    }
}

在上面的示例中,我们定义了三个具体处理者(ConcreteHandlerA、ConcreteHandlerB 和 ConcreteHandlerC),它们分别处理不同类型的请求("A"、"B" 和 "C")。客户端代码创建了一个处理器链,并将请求发送到链上的第一个处理者(handlerA)。根据请求的类型,相应的处理者会处理请求,或者将请求传递给下一个处理者。如果请求的类型不匹配任何处理者,则请求会被忽略。

其他:

责任链模式常见的一些实际应用场景:

  • 用户登录验证:
    • 在这种场景下,不同的验证步骤可以看作责任链中的不同节点,依次进行验证,直到所有验证都通过或某个验证失败为止。
    • 手机验证码登录:需要进行用户是否存在、验证码是否为空、验证码是否正确、用户是否锁定、用户是否被禁用等校验。
    • 用户名密码登录:需要进行用户是否存在、用户是否被锁定、密码校验等校验。
  • 请求处理系统:

    • 如Web应用中的过滤器链,每个过滤器负责处理不同类型的请求或执行不同的任务,如身份验证、日志记录、请求参数修改等。
    • 请求依次经过责任链中的各个处理器,直到被某个处理器处理或所有处理器都遍历完。
  • 日志系统:

    • 不同的日志级别(如INFO、DEBUG、ERROR)会对应不同的处理器。
    • 每个处理器负责处理对应级别的日志消息,并将其记录到相应的日志文件中或发送到日志服务器。
  • 事件处理系统:

    • 在图形用户界面(GUI)应用中,事件(如鼠标点击、键盘输入)会触发一系列的处理动作。
    • 这些处理动作可以看作责任链中的不同节点,依次进行处理,直到事件被完全处理或某个节点决定不再继续处理。
  • 数据校验和转换:

    • 在数据接收或发送过程中,可能需要对数据进行一系列的校验和转换操作。
    • 这些操作可以看作责任链中的不同节点,依次对数据进行处理,直到数据满足要求或处理完成。
  • 金融业务审批流程:

    • 如贷款审批、订单审批等,通常需要经过多个审批环节,每个环节都有相应的审批条件和审批人员。
    • 这些审批环节可以看作责任链中的不同节点,依次进行审批,直到审批通过或拒绝。
  • 消息过滤系统:

    • 在消息传递系统中,可能需要对消息进行一系列的过滤操作,如过滤垃圾邮件、过滤敏感词汇等。
    • 这些过滤操作可以看作责任链中的不同节点,依次对消息进行过滤,直到消息满足要求或所有过滤器都遍历完。

责任链模式在这些场景中的应用,使得系统的处理流程更加灵活和可扩展。通过动态地添加或删除处理节点,可以轻松地调整系统的处理逻辑,而无需修改现有的代码结构。同时,责任链模式也使得请求的处理过程更加清晰和易于维护。

责任链模式或者设计模式使用的场景有很多,但是,是否适合使用也很关键,不要为了使用而使用,否则也可能会带来更多的bug~~~

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

相关推荐

Java行为型设计模式-责任链模式

责任链模式()是一种行为型设计模式,‌它允许多个对象处理一个请求,‌每个对象都有机会处理请求,‌如果处理不了则传递给下一个对象,‌直到请求被处理或没有对象可以处理。‌责任链模式的主要目的是通过减少请求发送者和接收者之间的耦合度来提高系统的灵活性和可扩展性。‌它通过将处理请求的责任分配给一系列的对象,‌每个对象都有机会处理请求,‌如果当前对象无法处理请求,‌则将请求传递给下一个对象,‌直到找到能够处理请求的对象。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2032

设计模式-责任链模式(Chain of Responsibility)

责任链模式是一种面向对象设计模式,该模式中包含了一系列处理对象和命令对象。每个处理对象都有能力决定自己可以处理哪些命令对象,如果遇到无法处理的命令对象,它会将请求传递给下一个处理对象。这种模式的核心在于避免请求发送者与接收者之间的紧密耦合,让多个对象都有可能接收请求,并将这些对象连接成一条链,沿着这条链传递请求,直到有对象处理它为止。以公司员工请假为例,员工的请假请求可能有多个领导可以批准,但每个领导的批准权限不同。员工需要根据自己要请假的天数去找对应的领导签名。这就是责任链模式的一个生动实例。

miaoyl的博客 1万+

大众点评商家及评分数据(2012-2025)

大众点评及商家评分数据库全面覆盖全国范围内多个城市的商户信息,涵盖餐饮、购物、休闲娱乐等多个消费领域,包含商家基础信息、地理坐标、分类体系、经营状态、用户评价、消费水平及服务设施等共计28个字段。

Sunny9qx的博客 2694

责任链模式及其使用场景

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

虎哥LoveDroid 2万+

基于Simulink的IEEE33节点配电网仿真实战:从建模到分布式能源集成

本文详细介绍了基于Simulink的IEEE33节点配电网仿真实战,从基础建模到分布式能源集成。通过MATLAB脚本管理参数、搭建Simulink模块,并集成风机和光伏系统,实现高效配电网仿真。文章还涵盖潮流计算、故障分析及性能优化技巧,为电力系统仿真提供实用指导。

git9versioner的博客 991

Python RK3588 MPP 8路视频硬解码!全体目光向我看齐!

本文重写了官方demo、加入了Zlmediakit进行拉流并通过pybind11将代码封装成so库,现在,在python中直接通过import的方式,就能完成基础的拉流解码操作,目前支持8路拉流解码!!!

m0_46303486的博客 4880

设计模式学习—责任链模式(Chain of Responsibility Design Pattern)

责任链模式学习

闲鱼的博客 530

c++ mysql_init 返回无效指针_C++操作MYSQL遇到的一些问题

首先 我使用的是 vcpkg上面是我装的一些库《大大安利vcpkg 安装时一定要使用powershell进行编译装上vcpkg后装ligmariadb这个库,这个对Mysql操作还是挺方便的,然后说一下 在装库时碰到的一些问题1.网络问题1.参考了一下 github上的答案 将下载失败的url拷下来 自己下 然后再重新开始安装《vcpkg在安装时每一个需要下载的 都会提供url-仔细找,2.这个问...

weixin_32176627的博客 680

HeadFirst 设计模式学习笔记15--责任链模式拾零

本文已搬家至【HeadFirst 设计模式学习笔记】14 责任链模式拾零

gnuhpc的专栏 4914

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 403

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2354

《Java设计模式学习》责任链模式

责任链模式是一种行为型设计模式,它利用一系列对象来处理特定的请求或事件,并沿着一个链传递,直到有一个对象能够处理它。责任链模式可以解耦请求的发送者和接收者,同时也可以简化代码,提高灵活性和可维护性。它通常应用于一些需要动态处理请求的场景,例如日志记录、认证、缓存等。在责任链模式中,我们创建一个处理请求的对象链,并在其中设置每个对象的下一个对象。当请求通过链传递时,每个对象都有可能对请求进行处理,并决定是否将请求转发给下一个对象。

一个不断前行的程序者 188

Sparse-ICP—(4) 加权稀疏迭代最近点算法(matlab版)

本文介绍了加权稀疏迭代最近点算法的实现。

点云侠的博客 642

java设计模式学习之【责任链模式】

这篇教程不仅提供了责任链模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1328

第10篇:Agent + 爬虫 = 全自动数据采集专家

在企业级数据采集场景中,传统爬虫的痛点已经到了无法忽视的地步:而Agent + 爬虫的组合,就是这些痛点的终极解决方案。它的核心逻辑是:把爬虫从「人工写死的固定执行脚本」,升级为「能自主分析、自主决策、自主适配、自主修复的智能采集机器人」。我们在生产环境中做过对比测试:传统爬虫开发10个网站的采集脚本需要3人天,而Agent采集机器人只需要3分钟,页面改版后的修复成本从1人天降到了0,采集任务的成功率从62%提升到了95%以上。终端执行以下命令,安装基础依赖,与前9篇环境完全兼容: 二、核心能力拆解:Age

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1576

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

设计模式——责任链模式的学习与理解

什么是责任链模式 个人理解责任链模式就是当有多个接收者对象可以处理同一个请求的时候,为所有可以处理请求的接收者对象创建一个的有顺序的权力链,并且按照权力的大小来决定顺序的前后,从而避免了请求者和接收者直接的耦合关系,链上的每个接收者对象都包含者对下一个接收者对象的引用,也就是说,如果一个接收者未对请求进行处理,它就会把这个请求传送给下一个权力更大的接收者,直到有一个对象处理它为止。 案例 在高校中...

qq_44025396的博客 334

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

文章目录一、定义二、问题背景三、违背设计模式的设计实现1. 工程结构2. 代码实现四、问题改进1. 工程结构2. 代码实现3. 测试验证五、总结 一、定义 击鼓传雷,看上图你是否想起周星驰有一个电影,大家坐在海边围成一个圈,拿着一个点燃的炸弹,互相传递。 责任链模式的核心是解决一组服务中的先后执行处理关系,就有点像你没钱花了,需要家庭财务支出审批,10块钱以下找闺女审批,100块钱先闺女审批在媳妇审批。你可以理解想象成当你要跳槽的时候被安排的明明白白的被各个领导签字放行 二、问题背景 在本案例中我们模拟

南淮北安的博客 457

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 介绍 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者

DayDayUp的博客 325

设计模式学习总结:责任链模式

​ 本文为笔者在阅读一些书籍、博客、专栏等资料后所总结的个人对于责任链模式的笔记,由于笔者才疏学浅,若有不足之处,还望各位加以斧正,您的建议与鼓励都是笔者源源不断的前进动力。感谢! 文章大纲如下: 责任链模式的简单认识 责任链模式的简单应用 两种责任链的实现方法:基于数组、链表 责任链的一些简单应用 责任链模式在源码中的体现 责任链模式的优缺点 ###责任链模式简单认识 Avoid coupling the sender of a request to its receiver by givin

weixin_44836808的博客 509

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

【一】介绍引入 当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式(Chain of Responsibility Pattern)。 【二】场景引入 自从推出Java版本的糖果机之后,万能糖果公司收到的电子邮件数量已超出他们所能处理的范围。 据他们自己分析,所收到的电子邮件有四类: 其一、Fans寄来的信,他们喜欢新推出的l in 10游戏; 其二,父母寄来的信,抱...

Chimengmeng的博客 412

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

责任链模式

孙志南的博客 180

【设计模式】责任链模式学习小结

责任链模式是一种行为设计模式,我的理解是将一个对象(请求),与它的处理过程解耦。并且这个对象可以分别被不同的处理过程处理,将这些个处理过程对象连成一条链,并沿着这条链传递该请求。

m0_69818080的博客 1098

【设计模式】责任链模式学习

责任链模式,顾名思义,就是将需要实现的功能,拆分为各自专一的责任,组成一条责任链,来完成对数据的处理。 先看下面一段demo 需要被处理的对象类 @Data public class User { private String name; private int age; @Override public String toString() { ...

黄杨路打字员 183

【学习贴】设计模式——责任链模式

【责任链模式】这个设计模式貌似蛮好理解的,想象一下富土康三号流水线质检员张全蛋~,一部IPhone要经过层层质检,合格后方能出厂,每一道工序的质检员都有一个编号,通过了就贴一个带编号的质检通过标签,以后这块出了问题,很容易就找到是谁质检时候在划水。 贴代码:(不好意思,这次质检主机) using UnityEngine; /// <summary> /// 设计模式——责任链模式 //...

带酒书生的博客 266

一起学习设计模式:责任链模式

这样所有处理者都有机会来处理请求。上述代码中,抽象处理者类定义了对下家的引用对象,以便将请求转发给下家,该对象的访问符可设为 protected,在其子类中可以使用。避免将请求发送者与接收者耦合在一起,让多个对象都有机会接收请求,连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。发起请求和具体处理请求的过程进行解耦:责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

宇宙之一粟的技术漂泊之旅 491
上一篇: 浅聊java中的枚举以及关于枚举的常见面试问题
下一篇: 责任链模式在spring security过滤器链中的应用
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值