【Java开发】设计模式 14:责任链模式

news/2024/5/19 15:05:43 标签: 设计模式, 责任链模式, java

责任链模式介绍

责任链模式是一种行为设计模式,通常用于将请求从一个处理者传递到下一个处理者,并依次处理请求,直到所有处理者都无法处理为止。

责任链模式中,每个处理者都有机会处理请求并决定是否将请求传递给下一个处理者。这样,请求就可以在处理者之间自由流动,而不需要明确地指定哪个处理者将处理特定请求。这种灵活性使责任链模式特别适用于动态的、重叠的或未知的请求处理流程。

📌 场景

责任链模式的应用场景包括但不限于:处理请求、日志记录、权限验证、缓存等。该模式适用于多个处理对象按照一定规则处理同一类请求,且请求的接收者并不确定时使用。

📌 优点

  1. 降低系统耦合度,将请求发送者和接收者解耦。
  2. 简化了对象之间的关系。
  3. 增强了系统的灵活性,可以动态地新增或删除责任链中的处理对象。
  4. 可以对请求进行筛选,合理分配资源,提高系统的性能。

📌 缺点

  1. 当责任链过长时,会导致系统性能下降,因为每个请求都要遍历整个责任链。
  2. 对于比较复杂的业务场景,责任链模式可能会使代码难以维护和理解。
  3. 可能会存在处理漏洞的情况,即某个请求未被正确处理,导致系统出现异常。

责任链模式实现

以面试过程为例:

📌 1.定义面试处理程序

java">/**
 * 面试处理程序
 */
public abstract class Interview {
    /**
     * 下一轮面试
     */
    protected Interview successor;

    /**
     * 开始下一轮面试
     * @param successor 下一轮面试
     * @return 面试处理程序
     */
    public Interview connect(Interview successor) {
        this.successor = successor;
        // 这里返回后继节点,方便后面链式调用
        return successor;
    }

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

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

📌 2.定义具体面试

① 第一轮面试

java">public class FirstInterview extends Interview{

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

② 第二轮面试

java">public class SecondInterview extends Interview{

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

③ 第三轮面试

java">public class ThirdInterview extends Interview{

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

📌 3.调用

java">public class Client {
    public static void main(String[] args) {
        // 首先定义第一轮面试
        Interview interview = new FirstInterview();
        // 连接后续两轮面试
        interview.connect(new SecondInterview()).connect(new ThirdInterview());
        // 开始面试
        interview.handle();
    }
}

控制台输出:

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

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

java">interview.connect(new ThirdInterview()).connect(new SecondInterview());

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


http://www.niftyadmin.cn/n/240455.html

相关文章

LC-1043. 分隔数组以得到最大和(动态规划)

1043. 分隔数组以得到最大和 难度中等168 给你一个整数数组 arr&#xff0c;请你将该数组分隔为长度 最多 为 k 的一些&#xff08;连续&#xff09;子数组。分隔完成后&#xff0c;每个子数组的中的所有值都会变为该子数组中的最大值。 返回将数组分隔变换后能够得到的元素…

Visio-导出pdf格式的图

1.设计-大小-适应该图 或者其他调整 2.导出-创建PDF文档 3.点击选项-取消辅助功能文档结构标记

传统机器学习(四)聚类算法DBSCAN

传统机器学习(四)聚类算法DBSCAN 1.1 算法概述 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;具有噪声的基于密度的聚类方法&#xff09;是一种基于密度的空间聚类算法。 该算法将具有足够密度的区域划分为簇&#xff0c;并在…

求a的n次幂

文章目录 求a的n次幂程序设计程序分析求a的n次幂 【问题描述】要求利用书上介绍的从左至右二进制幂算法求a的n次幂; 【输入形式】输入两个正整数,一个是a,一个是n,中间用空格分开 【输出形式】输出一个整数 【样例输入】2 10 【样例输出】1024 【样例输入】3 4 【样例输出】…

数据格式转换(labelme、labelimg、yolo格式相互转换)

&#x1f468;‍&#x1f4bb;个人简介&#xff1a; 深度学习图像领域工作者 &#x1f389;总结链接&#xff1a; 链接中主要是个人工作的总结&#xff0c;每个链接都是一些常用demo&#xff0c;代码直接复制运行即可。包括&#xff1a; &am…

浏览器特色状态

强缓存&#xff1a;不会向服务器发送请求&#xff0c;直接从缓存中读取资源&#xff0c;在chrome控制台的Network选项中可以看到该请求返回200的状态码&#xff0c;并且Size显示from disk cache或from memory cache。 强缓存可以通过设置两种HTTP Header实现&#xff1a;Expir…

STL容器常用函数和算法总结表格

STL容器和常用成员函数和迭代器和对应的功能&#xff1a; 容器类型常用成员函数迭代器功能vectorpush_back, pop_back, size, empty, clearRandom Access Iterator动态数组&#xff0c;可随机访问dequepush_front, push_back, pop_front, pop_back, size, empty, clearRandom …

Spring Boot入门与进阶

本文将为您详细讲解Spring Boot的入门与进阶知识&#xff0c;包括Spring Boot的简介、环境搭建、基本功能以及高级特性&#xff0c;并配以丰富的代码示例&#xff0c;帮助大家快速掌握Spring Boot。 一、Spring Boot简介 Spring Boot是基于Spring框架的一种轻量级、快速开发的…