23种设计模式之职责链模式(Chain of Responsibility Pattern)

news2024/11/25 4:20:54

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的访问者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

文章目录

  • 责任链模式概念
  • 责任链模式角色
  • 责任链模式优缺点
  • 责任链模式应用场景
  • 责任链模式经典案例

以下正文开始

责任链模式概念

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过把请求的发送者和接收者解耦,将多个对象连接成一个链,并沿着这条链传递请求,直到有一个对象能够处理它为止,从而避免了请求的发送者和接收者之间的直接耦合

在责任链模式中,每个处理者都持有对下一个处理者的引用,即构成一个链表结构。当请求从链头开始流经链上的每个处理者时,如果某个处理者能够处理该请求,就直接处理,否则将请求发送给下一个处理者,直到有一个处理者能够处理为止。这种方式可以灵活地动态添加或修改请求的处理流程,同时也避免了由于请求类型过多而导致类的爆炸性增长的问题。

责任链模式角色

责任链模式的主要角色有:

抽象处理器(Handler):定义了一个处理请求的接口,并维护了对下一个处理器的引用。
具体处理器(Concrete Handler):实现了处理请求的方法,并决定是否能够处理该请求,如果不能处理,则将请求转发给下一个处理器。

责任链模式优缺点

责任链模式的优点如下:

  • 解耦责任的分配和调用者之间的关联,提高代码的灵活性和可扩展性。
  • 可以灵活的添加、删除处理器,以满足不同的业务需求。
  • 简化了对象之间的交互,避免了直接引用导致的紧耦合问题。

责任链模式的缺点如下:

  • 如果处理器链过长或者处理逻辑过于复杂,可能会影响系统性能。
  • 所有请求都必须被处理,否则可能会导致某些请求永远得不到处理。
  • 对于请求处理流程的调试和跟踪比较困难。

责任链模式应用场景

责任链模式适用于以下场景:

  1. 有多个对象可以处理一个请求,并且具体的处理器需要运行时才能确定。
  2. 需要动态指定请求处理流程的时候,或者需要根据数据动态修改请求处理流程的时候。
  3. 在请求的发送者和接收者之间需要解耦的时候。

责任链模式经典案例

接下来我们以一个经典案例来介绍下责任链模式:

假设有一个请假审批系统,需要对请假请求进行审批。此时可以使用责任链模式来处理审批请求。具体实现如下:

首先,定义一个抽象处理器(Handler)类,提供处理请求和设置下一个处理器的方法。

public abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(int leaveDays);
}

然后,定义具体的处理器(Concrete Handler)类,继承抽象处理器类,并实现具体的处理请求方法。如果无法处理该请求,则将请求交给下一个处理器处理。

public class Supervisor extends Handler {
    @Override
    public void handleRequest(int leaveDays) {
        if (leaveDays <= 2) {
            System.out.println("请假" + leaveDays + "天,主管审批通过。");
        } else if (successor != null) {
            successor.handleRequest(leaveDays);
        }
    }
}

public class Manager extends Handler {
    @Override
    public void handleRequest(int leaveDays) {
        if (leaveDays <= 5) {
            System.out.println("请假" + leaveDays + "天,经理审批通过。");
        } else if (successor != null) {
            successor.handleRequest(leaveDays);
        }
    }
}

public class Director extends Handler {
    @Override
    public void handleRequest(int leaveDays) {
        if (leaveDays <= 10) {
            System.out.println("请假" + leaveDays + "天,董事长审批通过。");
        } else {
            System.out.println("请假" + leaveDays + "天,无法得到批准。");
        }
    }
}

最后,在客户端代码中,创建一个处理器链,并将请求发送给链头的处理器处理。

public class Client {
    public static void main(String[] args) {
        Handler supervisor = new Supervisor();
        Handler manager = new Manager();
        Handler director = new Director();

        supervisor.setSuccessor(manager);
        manager.setSuccessor(director);

        supervisor.handleRequest(1);
        supervisor.handleRequest(4);
        supervisor.handleRequest(8);
        supervisor.handleRequest(12);
    }
}

上述代码中,首先创建了三个处理器对象,并构建处理器之间的关系。然后分别构造不同天数的请假请求,并将请求发送给链头的处理器处理。根据请假天数不同,处理器链中的不同处理器将分别进行处理。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集群化环境前置准备

集群化环境前置准备 介绍 需要完成集群化环境的前置准备&#xff0c;包括创建多台虚拟机&#xff0c;配置主机名映射&#xff0c;SSH免密登录等等。 部署 配置多台Linux虚拟机 安装集群化软件&#xff0c;首要条件就是要有多台Linux服务器可用。 我们可以使用VMware提供的…

冈萨雷斯DIP第1章知识点

文章目录 1.1 什么是数字图像处理1.3 数字图像处理技术应用领域实例1.4 数字图像处理的基本步骤 1.1 什么是数字图像处理 图像、数字图像 一幅图像可以定义为一个二维函数 f ( x , y ) f(x,y) f(x,y)&#xff0c; 其中 x x x 和 y y y 是空间(平面)坐标&#xff0c; 在坐标…

你真的会性能测试吗?资深测试总结全链路压测(详全)卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是全链路压测…

多分类问题练习

练习3&#xff1a;多分类问题 介绍 在本练习中&#xff0c;我们将使用逻辑回归来识别手写数字&#xff08;0到9&#xff09;。我们将扩展在练习2中对逻辑回归的实现&#xff0c;并将其应用于一对多的分类问题。 在开始练习前&#xff0c;需要下载如下的文件进行数据上传&…

【Python开发】FastAPI 08:Security 登录认证

FastAPI 在 fastapi.security 模块中提供了诸多安全性的工具&#xff0c;简化了各种安全机制的使用方法&#xff0c;可用于处理安全性、身份认证和授权等问题&#xff01; 目录 1 介绍 1.1 OAuth2 1.2 OpenAPI 2 安全基础 2.1 使用 Bearer ① OAuth2PasswordBearer ② 使…

开关电源关键参数计算方法

1、源调整率&#xff08;Line Regulation&#xff09;&#xff1a;将待测开关电源以额定输入电压及额定负载状况下热机15 分钟稳定后&#xff0c;分别于输入电压的下限、额定输入电压(Normal)、输入电压的上限测量并记录各自对应的输出电压值为 V1、V0&#xff08;normal&#…

Linux NGINX服务 ReWrite^location

ReWrite^location 从功能看 rewrite 和 location 似乎有点像&#xff0c;都能实现跳转&#xff0c;主要区别在于 rewrite 是在同一域名内更改获取资源的路径&#xff0c;而 location 是对一类路径做控制访问或反向代理&#xff0c;还可以proxy_pass 到其他机器。 rewrite 对访问…

Nginx正则表达式、location匹配、Rewrite重写详解

Nginx正则表达式、location匹配、Rewrite重写详解 一、常用的Nginx正则表达式二、location匹配概述1、location大致可以分为三类2、location常用的匹配规则3、location 优先级4、location 示例说明5、实际网站使用中&#xff0c;至少有三个匹配规则定义 三、rewrite重写1、rewr…

果推断16--基于反事实因果推断的度小满额度模型学习笔记

目录 一、原文地址 二、一些问题 2.1如何从RCT随机样本过渡到观测样本因果建模&#xff1f; 2.2反事实学习的核心思想 2.3度小满的连续反事实额度模型 Mono-CFR 2.4Mono-CFR代码实现&#xff08;待补充&#xff09; 2.5CFR学习 2.5.1CFR 2.5.2DR-CFR 参考 一、原文地…

Spring Cloud Alibaba — Nacos 构建服务注册中心

文章目录 Nacos Server下载启动登录创建命名空间 Nacos Client启动样例Nacos 服务发现配置项 集成 OpenFeign 远程接口调用添加 OpenFeign 依赖开启 EnableFeignClients 注解编写远程服务接口远程接口调用 集成 Sentinel 熔断降级添加 Sentinel 依赖开启 Sentinel 熔断降级编写…

【数据结构每日一题】链表——单链表重排

[数据结构习题]链表——单链表重排 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——顺序存储 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——链式存储 &#x1f449;[王道数据结构]习题导航&#x1f48e;&#xff1a; p …

pr安装缺少VCRUNTIME140.dll怎么办?这三个修复方案可以解决

在我们安装pr的时候&#xff0c;遇到缺少VCRUNTIME140.dll怎么办&#xff1f;vcruntime140.dll是一个Windows动态链接库&#xff0c;其主要功能是为C/C编译的程序提供运行时支持。这些库包括输入/输出函数、数学函数、字符串函数等等。因此&#xff0c;如果您的计算机缺少vcrun…

【接口自动化测试】一步一步教你搭建接口环境

要做接口测试&#xff0c;我们得搭建一套本地可以运行的接口环境。这次我选择了一个搭建容易&#xff0c;适合学习的系统——学生管理系统。 Python安装 这套管理系统是Python代码写的&#xff0c;因此需要Python环境。 安装挺无脑的&#xff0c;按照我提供的安装包和方法装…

windows下PC端小程序抓包--FiddlerCharles

目录 引言 【背景说明】 【操作说明】 【总结】 引言 大家好&#xff0c;你是否曾经遇到过想要抓取Windows下PC端小程序的网络请求数据&#xff0c;但不知道该用什么工具呢&#xff1f; 今天我要介绍的Fiddler和Charles两款工具&#xff0c;可帮助你轻松切入小程序网络请…

MySQL数据库 7.图形化界面工具DataGrip基础应用教学

目录 前言&#xff1a; DataGrip安装界面&#xff1a; 利用DataGrip创建数据库&#xff1a; 利用DataGrip为数据库创建表&#xff1a; 利用datagrip修改表&#xff1a; 添加元素&#xff1a; 结束&#xff01; 前言&#xff1a; 在之前我们一直接触的是MySQL命令行语句开…

4.3 最优装载

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是贪心算法的最优装载问题&#xff1f; 最优装载问题&#xff08;Bin Packing Problem&#xff09;是一个经典的组合优化问题&#xff0c;涉及将一…

【Linux】-编译器-gcc/g++使用以及动态库和静态库的介绍(以及解决sudo失败的方法)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点…

iOS证书(.p12)和描述文件(.mobileprovision)申请

目录 iOS证书(.p12)和描述文件(.mobileprovision)申请文末扩展&#xff08;UDID获取、添加测试设备&#xff09; 说明&#xff1a;本文申请证书、描述文件转载自 uniapp官网   iOS证书(.p12)和描述文件(.mobileprovision)申请      官网会时不时更新&#xff0c;如有疑问&…

《Apollo 智能驾驶进阶课程》二、 高精地图

1. 高精地图与自动驾驶的关系 1.1 高精地图与自动驾驶 L3级别以上才需要高精地图 1.2 什么是高精地图 1.3 高精地图与导航地图 1.4 高精地图-基础模块 高精地图与定位模块的关系 现在主流的自动驾驶的定位方案有两种&#xff1a;一种是基于点云&#xff0c;另一种是基于C…

投票系统(前后端分离)

1.投票系统的介绍 投票系统是一种用于组织选举和投票的软件系统&#xff0c;它可以帮助政府、企业、组织和社区等各种机构进行公正、透明和高效的投票活动。投票系统的主要功能包括&#xff1a;选民身份验证、投票管理、计票和结果公布等。 选民身份验证是指投票系统可以通过…