设计模式 15 责任链模式

责任链模式(Chain of Responsibility Pattern)属于 行为型模式

责任链,即责任的链条,在生活中是很常见的。

比如在工作中提交审批,会经历责任人的层层审批,最后才会通过,这一审批流程就是责任链。

再比如,JavaWeb 中学习的 Filter 过滤器,正是采用的责任链模式,通过将请求一级一级不断向下传递,来对所需要的请求进行过滤和处理。

运用责任链模式,可以让整个流程变得更加清晰,且每个环节的调用顺序可以灵活的调整,利于维护和扩展。

这里以面试过程为例介绍责任链模式:

1、定义面试处理程序

/**
 * 面试处理程序
 */
public abstract class Handler {

    /**
     * 下一轮面试
     */
    protected Handler successor;

    /**
     * 开始下一轮面试
     * @param successor 下一轮面试
     * @return 面试处理程序
     */
    public Handler connect(Handler successor) {

        this.successor = successor;
        // 这里返回后继节点,方便后面链式调用
        return successor;
    }

    /**
     * 开始面试
     */
    public void handle() {

        // 面试过程。由不同的子类实现具体处理过程
        this.doHandle();
        //责任链上如果还有后继节点,就继续向下传递
        Optional.ofNullable(this.successor).ifPresent(Handler::handle);
    }

    /**
     * 面试过程
     * 采用模板模式,变化的逻辑定义为抽象的,交由子类继承实现
     */
    public abstract void doHandle();

}

2、定义第一轮面试

/**
 * 第一轮面试
 */
public class FirstHandler extends Handler {

    @Override
    public void doHandle() {
        System.out.println("第一轮面试");
    }
}

3、定义第二轮面试

/**
 * 第二轮面试
 */
public class SecondHandler extends Handler {

    @Override
    public void doHandle() {
        System.out.println("第二轮面试");
    }
}

4、定义第三轮面试

/**
 * 第三轮面试
 *
 * @author CodeSail
 * @date 2022-08-14 15:39:52
 */
public class ThirdHandler extends Handler {

    @Override
    public void doHandle() {
        System.out.println("第三轮面试");
    }
}

5、调用

// 首先定义第一轮面试
Handler handler = new FirstHandler();
// 连接后续两轮面试
handler.connect(new SecondHandler()).connect(new ThirdHandler());
// 开始面试
handler.handle();

输出结果为:

第一轮面试
第二轮面试
第三轮面试

这样就实现按照预定的顺序的三轮面试。如果需要将第三轮面试调整到第二轮之前,只需要将连接顺序改变即可:

handler.connect(new ThirdHandler()).connect(new SecondHandler());

这样的输出就变成了:

第一轮面试
第三轮面试
第二轮面试

这就是责任链模式的好处,可以非常方便的对流程进行调整和控制。

1、降低耦合度。将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构,只负责自己的逻辑定义即可。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的顺序,可以动态地新增或者删除责任。

4、增加新的请求处理类很方便。

1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错。

1、多个对象处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

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

3、可动态指定一组对象处理请求。

在需要使用链式调用的场景都可以考虑使用责任链模式(Java Web中尤其多)。

Original: https://www.cnblogs.com/codesail/p/16585581.html
Author: 程序航
Title: 设计模式 15 责任链模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715007/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 期末代码

    使用Java的输入输出流将一个文本文件的内容按行读出,每读出一行,就顺序添加行号,并写入到另一个文件中。 import java.io.*; public class E { pu…

    技术杂谈 2023年6月21日
    069
  • 全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式

    Dora.Interception(github地址,觉得不错不妨给一颗星)提供了两种拦截器注册方式,一种是利用标注在目标类型、属性和方法上的InterceptorAttribut…

    技术杂谈 2023年5月31日
    078
  • 用python实现markdown转html

    1. 前言 现在markdown已经是非常常用的记录工具了,整齐的排版、代码高亮、图片表格样样齐全,同时也支持html标签,是非常好用的一种工具(语法)。 那么今天来分享一下使用p…

    技术杂谈 2023年7月11日
    089
  • C# 如何获取屏幕分辨率缩放比例

    获取分辨率缩放比例: undefined public const int HORZRES = 8; public const int VERTRES = 10; public c…

    技术杂谈 2023年5月30日
    095
  • srec_cat 常用参数的使用

    下面介绍映像文件工具 srec_cat 的使用,如何通过相关参数实现自己需要的功能。 文件类型 在输入文件和输出文件文件时要指明文件类型,常用的如: test.hex -intel…

    技术杂谈 2023年7月25日
    054
  • 迁移学习

    古语有言:”它山之石可以攻玉”,迁移学习就是这么一种思想,将在其他训练集上训练好的神经网络迁移到目标任务上。自打迁移学习的思想提出后,在工业实践上,就很少有…

    技术杂谈 2023年7月23日
    059
  • 关于测试的讨论从未停止过

    关于测试的讨论从未停止过,最近忙着推荐 seldom 测试框架,所以,上testerhome 次数增加。 有人发贴子 技术&#x…

    技术杂谈 2023年5月31日
    078
  • 安装webgot漏洞实验平台时遇到的java环境配置问题

    6 .安装并注册 依次执行命令: 将已下载的Java版本登记为替代版本,将其改成作为默认版本来使用: update-alternatives –install /usr…

    技术杂谈 2023年7月11日
    060
  • 小米pad4 刷官方rom 9.6.6 打电话功能

    下载后解压tgz包,成为文件夹备用 步骤2:小米官方下载手机刷机解锁工具: https://www.miui.com/unlock/index.html 并解锁(是否需要执行此步骤…

    技术杂谈 2023年5月31日
    0143
  • How to kill server when seeing “EADDRINUSE: address already in use”

    How to kill server when seeing “EADDRINUSE: address already in use” https://st…

    技术杂谈 2023年5月31日
    082
  • event点击事件埋点统一代码方便复制粘贴

    组件各个位置的点击次数,需要对type=click 的event的事件进行埋点,系统会校验所有type=click 的 event中的actions,需要保证以下几点,不符合的组件…

    技术杂谈 2023年6月1日
    082
  • 稀疏数组详细讲解

    稀疏数组的应用场景 稀疏sparsearray数组 稀疏:从字面意思理解就是为了压缩重复冗余的数据 基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组…

    技术杂谈 2023年6月21日
    071
  • 阿里DDD项目最佳实践-COLA 架构总览

    DDD分层架构、六边形架构、洋葱圈架构、以及 COLA 架构的核心职责就是要做核心业务逻辑和技术细节的分离和解耦。 在架构思想上,COLA 主张像六边形架构那样,使用端口-适配器去…

    技术杂谈 2023年6月1日
    079
  • 架肩与拐肘

    内家拳大多讲究沉肩坠肘,太极拳也是,沉肩坠肘是费时功夫,成年人必须花一定的时间专门去纠正。沉肩坠肘解决不了,上肢的实战只能靠蛮力。 沉肩功夫出不来的人,力从地起的劲力很难直接自然性…

    技术杂谈 2023年5月31日
    081
  • 常用命令

    ssh免密登录 ssh-copy-id remote-machine 比如 ssh-copy-id pengdl@localhost -p 8765这个命令把当前用户的公钥串写入到…

    技术杂谈 2023年5月31日
    067
  • 数据库事务知识整理

    什么是数据库事务? 事务,就是一系列操作的整体,其结果就是这一系列操作要么全部成功,要么全部失败。 譬如说,一个经典的例子–转账。A要转帐给B 100块钱,要经历以下步…

    技术杂谈 2023年7月11日
    047
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球