责任链设计模式介绍及实战

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

责任链设计模式介绍及实战

1、责任链模式

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

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

介绍

**意图:**避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

**主要解决:**职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

**何时使用:**在处理消息的时候以过滤很多道。

**如何解决:**拦截的类都实现统一接口。

**关键代码:**Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。

缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。

使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。

**注意事项:**在 JAVA WEB 中遇到很多应用。

2、责任链设计模式实战

2.1、业务场景介绍

支付模块,获取支付链接流程:

  1. 确认是否需要发短信;
  2. 发短信;
  3. 验证短信;
  4. 支付校验;
  5. 获取支付链接。

抽取责任链:
(主要通过枚举状态来控制那个责任)

  1. 无行为责任;
  2. 支付链接获取成功责任;
  3. 确认是否需要发短信责任;
  4. 发短信;
  5. 获取支付链接责任。

2.2、代码实现

2.2.0、面向接口编程

/**
 * @author :
 * @date :Created in 17:01 2022/10/19
 * @description :
 * @version: 1.0
 */
public interface IPaymentService {

    PaymentStatus doService(Payment payment);

    boolean support(Payment payment);

    String name();
}

2.2.1、无行为责任

/**
 * @author :
 * @date :Created in 17:06 2022/10/19
 * @description :
 * @version: 1.0
 */
@Order(1)
@Slf4j
@Service
class A_Payment_NoAction implements IPaymentService {

    @Override
    public PaymentStatus doService(Payment payment) {
        //日志输出
        return payment.getStatus();
    }

    @Override
    public boolean support(Payment payment) {
        //根据状态等信息判断是否该类处理
        return true;
    }

    @Override
    public String name() {
        return "NoAction处理器,只返回当前状态";
    }

}

2.2.2、支付链接获取成功责任

/**
 * @author :
 * @date :Created in 17:06 2022/10/19
 * @description :
 * @version: 1.0
 */
@Order(2)
@Slf4j
@Service
class A_Payment_ApplyDone implements IPaymentService {

    @Override
    public PaymentStatus doService(Payment payment) {
        //日志输出
        //处理逻辑
        return payment.getStatus();
    }

    @Override
    public boolean support(Payment payment) {
        //根据状态等信息判断是否该类处理
        return true;
    }

    @Override
    public String name() {
        return "流程结束支付";
    }

}

2.2.3、确认是否需要发短信责任

/**
 * @author :
 * @date :Created in 17:06 2022/10/19
 * @description :
 * @version: 1.0
 */
@Order(3)
@Slf4j
@Service
class A_Payment_SmsRequirement implements IPaymentService {

    @Override
    public PaymentStatus doService(Payment payment) {
        //日志输出
        //处理逻辑
        return payment.getStatus();
    }

    @Override
    public boolean support(Payment payment) {
        //根据状态等信息判断是否该类处理
        return true;
    }

    @Override
    public String name() {
        return "确认是否需要发短信责任";
    }

}

2.2.4、发短信责任

/**
 * @author :
 * @date :Created in 17:06 2022/10/19
 * @description :
 * @version: 1.0
 */
@Order(4)
@Slf4j
@Service
class A_Payment_SendSms implements IPaymentService {

    @Override
    public PaymentStatus doService(Payment payment) {
        //日志输出
        //处理逻辑
        return payment.getStatus();
    }

    @Override
    public boolean support(Payment payment) {
        //根据状态等信息判断是否该类处理
        return true;
    }

    @Override
    public String name() {
        return "发短信责任";
    }

}

2.2.5、获取支付链接责任

/**
 * @author :
 * @date :Created in 17:06 2022/10/19
 * @description :
 * @version: 1.0
 */
@Order(5)
@Slf4j
@Service
class A_Payment_GetPaymentUrl implements IPaymentService {

    @Override
    public PaymentStatus doService(Payment payment) {
        //日志输出
        //处理逻辑
        return payment.getStatus();
    }

    @Override
    public boolean support(Payment payment) {
        //根据状态等信息判断是否该类处理
        return true;
    }

    @Override
    public String name() {
        return "获取支付链接责任";
    }

}

2.2.6、流程执行器

@Slf4j
@Service
class PayProcessConductorImpl implements IPayProcessConductor {

    private List<IPaymentService> paymentServices

    @Override
    PrePayResponse startProcess(DtoPrePay prePay) {
        //流程第一步检查
        //适配责任
        IPrePayService service = baseRuleTypes.stream()
            .filter(api -> api.support(payment))
            .findFirst()
            .orElseThrow(() -> new CommonException(PARAMETER_ERROR.getCodeValue(), "暂不支持该类型"));
        //处理逻辑
        service.doService(payment)
        //状态转换
        //返回
        return response
    }


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

相关推荐

责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为型设计模式,它将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。责任链模式是一种灵活且强大的设计模式,尤其适用于处理流程化的请求处理场景。它通过将请求的发送者和接收者解耦,提高了系统的灵活性和可扩展性。抽象出请求处理者的统一接口或抽象类每个处理者只关注自己能处理的请求类型构建一条处理链,让请求在链上传递客户端只需要访问链的头部节点合理设计链的长度,避免链过长导致性能问题。

yk_dflkg的博客 1248

实战:设计模式之责任链设计模式深度解析

相信大家都有做过表单校验的工作,假如此时需要做一个登陆校验(用户名、密码、验证码),首先肯定是校验用户名,校验通过则进入下一步校验密码,否则提示用户,校验密码用过,则校验验证码,否则提示用户,表单全部校验通过,才开始提交到后台。2. 如果此时我想更改关卡的顺序,比如将第 3 关放到第 1 关,第 4 关放到第 2 关,每次更改关卡的顺序非常不便,而且更改关卡的顺序,对应关卡的逻辑也要跟着一起改变位置,非常麻烦,而且容易改出问题。或者说,当你的代码中出现这种情况的时候,你也可以考虑通过责任链设计模式来改进。

loveLifeLoveCoding的博客 662

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版)

本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。

weixin_33728268的博客 514

责任链实战场景剖析、以及手写责任链

最早接触责任链这个设计模式,是我老早前看 Spring Aop 的源码的时候,Aop 的原理是遍历一根按照顺序装载好的 Advice(通知)拦截器链条,使@Before、@After 这些 Advice(通知)中的逻辑有顺序执行。如果我们没有 @After 的需要 ,Spring 只需把拦截器链条中的 @After 这个节点去掉就是了。十分的方便快捷!

风团团 1419

从零到一:手把手教你用Python+LangChain搭建企业级RAG知识库(附避坑指南)

本文为开发者提供了一份详尽的实战指南,手把手教你使用Python和LangChain框架从零构建企业级RAG知识库。内容涵盖环境搭建、文档处理、向量化检索、提示工程及生产部署等核心环节,并重点分享了文档分割、检索优化等关键避坑经验,旨在帮助读者打造稳定、高效且易于维护的智能知识中枢。

weixin_29058331的博客 399

iTunes登录协议抓包避坑指南:解决HTTPDebugger被检测问题(附临时方案)

本文详细解析了iTunes客户端登录协议抓包时遇到的HTTPDebugger等工具被检测的问题,并提供了实战解决方案。通过逆向分析iTunes的反调试与反检测机制,文章指导读者如何定位并绕过关键检测点,成功捕获登录流量,并深度解析了包括证书获取、签名缓冲区和最终认证在内的核心协议流程。

qsc901234的博客 809

【设计模式专题】责任链模式实战讲解

责任链模式是一种让校验逻辑与业务解耦的一种设计模式,让每个节点都有自己的处理器,处理器去处理具体逻辑,并且每个节点都有对下一个节点的引用,类似于没有prev的单向链表,当前节点指向下一个节点。当调用方法时,沿着预定的链路依次对每个节点进行处理,直到某个节点被终止或整条链路处理完成。让调用方法者不用在意方法内的校验逻辑,只需要关注业务逻辑,让业务结构更加清晰。将请求和处理进行解耦;请求处理者只关注自己感兴趣的请求进行处理,对于不感兴趣的交给下一个节点处理;......

weixin_42469135的博客 4103

BME688传感器原理图设计,已量产(环境传感器)

在便携式空气质量监测、可穿戴健康设备这类低功耗场景中,BME688 这类集成了 VOC、温湿度、气压的四合一 MEMS 传感器越来越受欢迎 —— 它体积小、功耗低,刚好匹配便携设备的需求。但这类小信号传感器对电源噪声、电平匹配的要求很细,今天结合实际项目里的一款 BME688 接口电路,聊聊硬件设计的关键细节。

不脱发的程序猿 516

浅谈责任链设计模式在框架源码中的运用

写在前面,该篇博文为我在部门的技术分享,分享时长约40分钟。以至于文章中更多的只有源代码截图,更多细节为现场口述。本文更像是一个大纲,通过6+3个真实的责任链代码实现,为我们能够灵活运用责任链设计模式添砖加瓦。希望对你有帮助!

持续Java学习中 1296

AI摄影师:自动构图与修图算法设计

AI摄影师:自动构图与修图算法设计​ ,人工智能,计算机视觉,大模型,AI,AI 摄影师的核心能力体现在两方面:自动构图(通过算法优化画面元素布局)与智能修图(自动调整光影、色彩、细节)。例如,手机摄影中的 “AI 构图建议” 功能可实时框选最佳拍摄区域,修图软件中的 “一键增强” 能在 0.1 秒内完成专业级调色,这些都依赖于计算机视觉与深度学习的深度融合。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 16万+

近五年体内微/纳米机器人赋能肿瘤精准治疗综述:以 GBM 为重点

摘要 微/纳米机器人在实体瘤治疗领域展现出突破性潜力,通过主动运动能力解决传统纳米药物递送效率低、渗透不足等核心问题。2021-2025年间形成三条技术路线:1) 磁驱、声驱等运动增强递送实现深层渗透;2) 与免疫治疗融合实现原位免疫唤醒;3) 针对胶质母细胞瘤开发跨屏障递送系统。研究重点从单一运动性能转向"运动-分布-疗效"的系统评价,需建立标准化指标评估运动学参数、肿瘤分布均匀性和安全性。未来挑战在于临床转化的可制造性、闭环操控及生物相容性优化,特别是对血脑屏障穿透等复杂场景的系统集

AllenLV的博客 5193

设计模式(实战)-责任链模式

一:模式说明 模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果(取自《设计模式之禅》)。 翻译:Client对象调用一个处理者(类)的方法,可能有多个处理者(实现类),但是该对象只需要调用第...

谢文峰的博客 820

流体动力学仿真软件:Star-CCM+_(1).Star-CCM+基础及入门

Star-CCM+的用户界面(UI)分为多个部分,包括菜单栏、工具栏、工作区、视图窗口和控制台。菜单栏包含文件、编辑、视图、工具等常用菜单。例如,“File”菜单可以用于打开、保存和退出项目。工具栏提供常用的工具按钮,如新建项目、打开项目、保存项目等。也可以自定义工具栏,添加常用的功能按钮。工作区显示当前项目的结构和各个对象。可以通过拖拽方式组织和管理项目中的各个部分。视图窗口显示几何模型、网格、结果等。可以通过不同的视图模式查看和分析数据。控制台显示软件的运行日志和输出信息。

kkchenjj的博客 1204

设计模式——责任链设计模式(行为型)

责任链设计模式是一种行为型设计模式,旨在将请求的发送者与接收者解耦,通过多个处理器对象按链式结构依次处理请求,直到某个处理器处理为止。它包含抽象处理者、具体处理者和客户端等核心角色。该模式适用于多个对象可能处理请求的场景,如风控系统中的贷款申请流程,通过链式组合处理整个流程。实现方式包括链式引用和集合遍历等,适用于信贷申请风控校验等实际应用。

庄小焱 1480

浏览器解析HTML的过程及编程实现

需要注意的是,上述示例代码只是简化的演示,并未涵盖浏览器解析HTML的所有细节和复杂性。实际上,浏览器的HTML解析引擎还会处理一系列的特殊情况、错误容错和性能优化等方面的内容,以确保能够正确解析各种类型的HTML代码。HTML(超文本标记语言)是构建网页的基础语言,浏览器负责将HTML代码解析并渲染成可视化的网页。本文将详细介绍浏览器解析HTML的过程,并提供相应的编程示例代码。希望以上内容能帮助您理解浏览器解析HTML的过程,并通过提供的示例代码更好地了解如何在编程中实现这一过程。

ByteJolt的博客 322

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

责任链设计模式与应用:实现拦截器责任链统计接口执行时间和性能

一、什么是责任链设计模式 1、什么是责任链设计模式? 责任链设计模式主要构成有抽象处理者、具体处理者、客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样链路上所有处理对象都有机会处理请求,使发送者与接收者之间解耦。 见:https://blog.youkuaiyun.com/noaman_wgs/article/details/77838222 2、使用场景 使用责任链模式的优点: 发送者...

noaman_wgs的博客 1059

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【校招VIP】java设计模式之责任链模式

考点介绍:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。本期分享的java设计模式之责任链模式,分为试题、文章以及视频三部分。答案详情解析和文章内容点击下方链接即可查看!...

shuize123的博客 363

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【C++】责任链模式

责任链模式(Chain of Responsibility Pattern)是一种【行为型】设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦,使得多个处理者都有机会处理请求,而无需客户端直接知道具体的处理者。

AAADiao的博客 809

责任链模式

责任链模式(Chain of Responsibility Pattern)将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从链式的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止,属于行为型设计模式。责任链模式(Chain of Responsibility)是一种处理请求的模式,它让多个处理器都有机会处理该请求,直到其中某个处理成功为止。

SunnyRivers 1160

设计模式之责任链模式

责任链模式是常见的行为型设计模式。当我们需要实现的业务逻辑需要通过多个步骤来处理,并且这些步骤有排列组合的场景时,就可以使用责任链模式。

装睡的小5郎的博客 528

如何使用责任链模式优雅实现功能(滴滴司机、家政服务、请假审批等)

责任链模式是一种行为型设计模式,常用于审批流程、事件处理、日志过滤等场景。它通过将多个处理器组成链条,使请求依次传递,直到被处理或终止。本文详细讲解了责任链的使用场景、实现步骤、优点以及注意事项,帮助开发者在实际项目中灵活应用此模式,实现高内聚、低耦合、可扩展的业务处理链路。适用于请假审批、滴滴接单、家政派单等业务系统。

m0_73612839的博客 1162

PHP完整实战23种设计模式

前言 设计模式是面向对象的最佳实践 实战 PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元模式 外观模式 适配器模式 装饰器模式 组合模式 代理模式 过滤器模式 PHP实战行为型模式 模板模式 策略模式 状态模式 观察者模式 责任链模式 访问者模式 解释器模式 备...

weixin_34221112的博客 223

设计模式——责任链

责任链模式是一种行为型设计模式,将多个对象连接成一条链,并且沿着这条链传递请求,让多个对象都有机会处理这个请求,请求会顺着链传递,直到某个对象处理它为止,它主要避免了请求发送者和接受者之间的耦合,增强了系统的灵活性和可扩展性。一般用在什么场景?

cui_hao_nan的博客 400

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

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

山人行 1399

DesignPattern设计模式

本文主要介绍了设计模式相关内容。包括软件设计的SOLID原则,设计模式的分类,单例模式的思想与实现,工厂模式的思想与实现,建造者模式的思想与实现,代理模式的思想与实现,责任链模式的思想与实现等内容。供个人学习使用。

专注Java和MySQL领域知识分享 1885

责任链设计模式和规则树设计模式

责任链模式和规则树模式区别及示例讲解

2301_79484620的博客 1690
上一篇: 工厂+模板模式介绍及实战
下一篇: 项目中五种延迟队列的实现及优缺点
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小白de成长之路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值