设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景

news/2024/5/19 12:55:39 标签: 设计模式, 责任链模式, java

系列文章目录

设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列
设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点
设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用场景和优缺点。
设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景
设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码
设计模式之-代理模式,快速掌握理解代理模式,以及代理模式的使用场景
设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
设计模式之-中介者模式,快速掌握中介者模式,通俗易懂的讲解中介者模式以及它的使用场景
设计模式之-责任链模式,快速掌握责任链模式,通俗易懂的讲解责任链模式以及它的使用场景
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景
设计模式之-适配器模式,快速掌握适配器模式,通俗易懂的讲解适配器模式以及它的使用场景


文章目录


一、快速理解责任链模式

责任链模式是一种行为型设计模式,它将请求的发送者和接收者解耦,使多个对象都有机会处理请求。每个接收者都包含对下一个接收者的引用,形成一个链条,当请求从链条的头部开始传递时,每个接收者都有机会处理请求,直到有一个接收者能够处理为止。

在现实生活中,责任链模式的例子可以是请假审批流程。假设有多个层级的审批人员,每个人都有不同的审批权限。当员工提交请假申请时,请求会从最高层级的审批人员开始传递,如果一个审批人员无法处理请求,则将请求传递给下一个审批人员,直到有人能够处理为止。

二、责任链模式使用场景

  1. 当有多个对象可以处理同一个请求时,可以使用责任链模式。每个对象都有机会处理请求,但处理者不需要知道请求的发送者和后续处理者。
  2. 当需要动态指定处理请求的对象时,可以使用责任链模式。可以根据特定条件来决定请求的传递顺序或跳过某些处理者。

代码示例

下面是一个通俗易懂的责任链模式示例代码,以请假审批为场景:

// 抽象处理者:审批人
abstract class Approver {
    protected Approver nextApprover;

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void approveLeave(int days);
}

// 具体处理者:主管
class Supervisor extends Approver {
    @Override
    public void approveLeave(int days) {
        if (days <= 2) {
            System.out.println("主管批准了请假申请");
        } else {
            if (nextApprover != null) {
                nextApprover.approveLeave(days);
            } else {
                System.out.println("没有人能够处理该请假申请");
            }
        }
    }
}

// 具体处理者:经理
class Manager extends Approver {
    @Override
    public void approveLeave(int days) {
        if (days <= 5) {
            System.out.println("经理批准了请假申请");
        } else {
            if (nextApprover != null) {
                nextApprover.approveLeave(days);
            } else {
                System.out.println("没有人能够处理该请假申请");
            }
        }
    }
}

// 具体处理者:CEO
class CEO extends Approver {
    @Override
    public void approveLeave(int days) {
        if (days <= 7) {
            System.out.println("CEO批准了请假申请");
        } else {
            System.out.println("没有人能够处理该请假申请");
        }
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Approver supervisor = new Supervisor();
        Approver manager = new Manager();
        Approver ceo = new CEO();

        supervisor.setNextApprover(manager);
        manager.setNextApprover(ceo);

        supervisor.approveLeave(3); // 主管批准了请假申请
        supervisor.approveLeave(6); // CEO批准了请假申请
        supervisor.approveLeave(9); // 没有人能够处理该请假申请
    }
}

在上面的示例中,Approver是抽象处理者,定义了处理请假申请的方法和下一个处理者的引用。Supervisor、Manager和CEO是具体处理者,分别实现了抽象处理者的处理请假申请方法,并在其中判断是否能够处理请求,如果不能处理则将请求传递给下一个处理者。

在客户端代码中,首先创建了主管、经理和CEO对象,并设置它们的下一个处理者。然后调用主管的approveLeave方法来发起请假申请,该方法会根据请假天数判断是否能够处理请求,如果不能处理则会将请求传递给下一个处理者。最后,根据不同的请假天数,输出不同的处理结果。

通过使用责任链模式,可以灵活地指定处理请求的对象,并且可以动态调整处理者的顺序或跳过某些处理者。责任链模式还可以将请求的发送者和接收者解耦,使得它们之间的依赖关系更加松散。


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

相关文章

怎么选,都得是python!

什么编程语言最好&#xff1f; python!python!python! 天下语言千千万&#xff0c;不行咱就换&#xff01; 但是&#xff0c;兜兜转转&#xff0c;到头来发现还得是你——python 最香! 有一说一&#xff0c;为了早日实现财富自由&#xff0c;开篇建议&#xff1a;专业人士还…

35.java后端面试宝典

一、自我介绍。 我叫什么&#xff0c;这次是应聘什么岗位&#xff0c;会什么技术&#xff0c;会什么框架&#xff0c;熟练掌握框架之间的整合技术&#xff0c;做过什么项目并且介绍主要做了什么&#xff0c;并且可以为公司带来什么价值。 总的来说&#xff0c;初级Java工程师岗…

基于SVM的鸟鸣识别,语谱分析

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接: 基于SVM的鸟鸣识别,语谱分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88610830 SVM应用实例, 基于S…

【Python必做100题】之第二十四题(成绩if语句)

题目&#xff1a;利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间的用B表示&#xff0c;60分以下的用C表示 代码如下&#xff1a; score int(input("请输入学生成绩&#xff1a;")) if score > 90:print(&qu…

如何兼容多版本protoc

兼容多版本protoc&#xff0c;一度让我崩溃。 文章由来&#xff1a;在进行文章“gazebo11px4联合仿真测试”时&#xff0c;由于gazebo11需要protobuf3.6.1&#xff0c;而之前系统又已安装其它版本。 特别是&#xff0c;在进行“多传感器融合定位”学习时&#xff0c;前后也需要…

16、Qt线程(一):继承QThread,重写run

一、说明 Qt提供了3个类4种方式创建线程&#xff1a; 1、QThread ①继承QThread类&#xff0c;重写run()函数 ②继承QObject类&#xff0c;使用moveToThread()函数 2、使用QtConCurrent并发模块的run()函数 3、继承QRunnable类 二、功能说明 1、通过继承QThread&#xff0c;重…

在 HTML 中实现标签的 class 继承

在HTML中&#xff0c;class是一种关键的属性&#xff0c;它允许开发者为HTML元素定义样式或者JavaScript脚本提供钩子。 虽然HTML本身并不提供类似于传统面向对象编程语言中的类和继承的概念&#xff0c;但是通过合理的使用class属性&#xff0c;我们可以模拟一些类似的效果&a…

Centos系统升级gcc版本

自己环境的gcc版本太低&#xff0c;影响使用SAN全家桶进行内存泄露检查 当前环境gcc版本查看 gcc --version 进行升级&#xff1a; 1、安装EPEL存储库 yum install epel-release -y 2、确保系统已经更新到最新版本 yum update -y 3、安装GCC编译器及其相关工具包 yum g…