金三银四面试题(二十六):责任链模式知多少?

什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在通过将请求的处理分布在一系列对象上,从而使得多个对象可以尝试处理同一个请求。这些对象被链接成一条链,每个对象都可以对请求进行处理,如果不能处理,则将请求传递给链中的下一个对象。

特点

  1. 请求的分发:请求在责任链中的每个对象上逐个传递,直到请求被处理或到达链的末端。

  2. 链上的对象:链上的每个对象都可以选择处理请求或将其传递给下一个对象。

  3. 解耦:请求的发送者和处理者之间的解耦。请求发送者不需要知道请求是由谁处理的。

  4. 可扩展性:可以动态地添加、移除或重新排列链上的对象,以调整请求的处理流程。

应用场景

  • 请求的处理需要经过多个对象,每个对象都可以对请求进行部分处理。
  • 请求的发送者和处理者之间的解耦。
  • 动态地添加或移除请求处理者。

优点

  • 松散耦合:请求的发送者和处理者之间的解耦。
  • 灵活性:可以动态地调整链中的对象以适应变化的需求。
  • 可维护性:链上的对象可以独立维护和扩展。

缺点

  • 链过长:如果责任链过长,可能导致请求处理效率低下。
  • 调试困难:由于请求在链中逐个传递,调试可能比较困难。

示例

SpringMVC 中的拦截器和Mybatis 中的插件机制,都是拦截器经典实现。

可以参照公司审批:我们在公司内部发起一个OA 审批流程,项目经理审批、部门经理审批。老板审批、人力审批。这就是生活中的责任链模式,每个角色的责任是不同。

下面是一个示例程序,展示了责任链模式在处理请假请求中的应用。程序定义了一个 Request 类表示请求,Handler 接口表示责任链中的处理者。然后通过三个具体的处理者类来处理请求。

// 请求类
class Request {private final int days;public Request(int days) {this.days = days;}public int getDays() {return days;}
}// 处理者接口
interface Handler {void setNextHandler(Handler nextHandler);void handleRequest(Request request);
}// 具体处理者类:主管
class SupervisorHandler implements Handler {private Handler nextHandler;@Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(Request request) {if (request.getDays() <= 3) {System.out.println("Supervisor approved the leave request for " + request.getDays() + " days.");} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("Leave request for " + request.getDays() + " days is denied.");}}
}// 具体处理者类:经理
class ManagerHandler implements Handler {private Handler nextHandler;@Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(Request request) {if (request.getDays() <= 7) {System.out.println("Manager approved the leave request for " + request.getDays() + " days.");} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("Leave request for " + request.getDays() + " days is denied.");}}
}// 具体处理者类:总监
class DirectorHandler implements Handler {@Overridepublic void setNextHandler(Handler nextHandler) {// 总监通常是责任链的末端,不需要设置下一个处理者}@Overridepublic void handleRequest(Request request) {if (request.getDays() <= 14) {System.out.println("Director approved the leave request for " + request.getDays() + " days.");} else {System.out.println("Leave request for " + request.getDays() + " days is denied.");}}
}// 客户端代码
public class ChainOfResponsibilityDemo {public static void main(String[] args) {// 创建责任链Handler supervisor = new SupervisorHandler();Handler manager = new ManagerHandler();Handler director = new DirectorHandler();// 设置责任链的顺序supervisor.setNextHandler(manager);manager.setNextHandler(director);// 创建请求Request request1 = new Request(2);Request request2 = new Request(5);Request request3 = new Request(12);Request request4 = new Request(20);// 处理请求supervisor.handleRequest(request1);  // 主管处理supervisor.handleRequest(request2);  // 经理处理supervisor.handleRequest(request3);  // 总监处理supervisor.handleRequest(request4);  // 请求被拒绝}
}

我们定义了一个 Request 类表示请求,包含请假的天数。Handler 是责任链中的处理者接口,定义了 setNextHandlerhandleRequest 方法。三个具体的处理者类 SupervisorHandlerManagerHandlerDirectorHandler 分别代表主管、经理和总监,每个处理者都有不同的权限范围。如果当前处理者不能处理请求,就将请求传递给链中的下一个处理者。客户端创建请求并将其传递给责任链,由链中的处理者逐个处理请求。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8种区块链开发者必须知道的顶级编程语言!

我来问你一个问题&#xff1a;请说出一种技术&#xff0c;它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是&#xff0c;当然是区块链&#xff0c;它在近些年进入大家的视野并颠覆了工商业&#xff0c;没有任何其他技术能够做到这一点。 预计从2020年…

1065 单身狗

solution “单身狗”&#xff1a;没有搭子或者搭子没来的参与者输出id时按增序输出 #include<iostream> #include<map> #include<algorithm> using namespace std; const int maxn 1e6, maxn1 1e4 10; int flag[maxn] {0}, all[maxn1]; int main(){int…

weblogic 反序列化 CVE-2018-2628

这个漏洞因为java版本问题一直下载不了ysoserial反序列化工具&#xff0c;没办法生成payload。这里记录一下漏洞原理。 一、漏洞简介 Weblogic Server中的RMI 通信使用T3协议在Weblogic Server和其它Java程序&#xff08;客户端或者其它Weblogic Server实例&#xff09;之间传…

JVM之运行时数据区

Java虚拟机在运行时管理的内存区域被称为运行时数据区。 程序计数器&#xff1a; 也叫pc寄存器&#xff0c;每个线程会通过程序计数器记录当前要执行的字节码指令的地址。程序计数器在运行时是不会发生内存溢出的&#xff0c;因为每个线程只存储一个固定长度的内存地址。 JAVA虚…

【网站项目】SpringBoot803房屋租赁管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【C/C++】C/C++ 校园失物招领系统设计与实现(源码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

保研机试之【二叉树后序】--1道题

参考&#xff1a;东哥带你刷二叉树&#xff08;后序篇&#xff09; | labuladong 的算法笔记 建议先过一遍&#xff1a;今天是二叉树~-CSDN博客&#xff0c;very重要&#xff01; 然后再过一遍&#xff08;理解怎么应用方法&#xff09;&#xff1a;保研机试之[三道二叉树习题…

C++初学者,使用汉语编程

现在的IDE是完全支持中文编程的&#xff0c;对于C语系的爱好者来说&#xff0c;又可以发挥自己的想象力了。 今天使用一些宏定义写了一个小程序&#xff0c;用于玩弄C。 我喜欢C语言&#xff0c;是因为C语言简单&#xff0c;语法简洁。我也喜欢汉语&#xff0c;因为汉语语法简…

保研机试之【二叉树序列化】

老规矩咯&#xff1a; 参考&#xff1a;东哥带你刷二叉树&#xff08;序列化篇&#xff09; | labuladong 的算法笔记 建议先过一遍&#xff1a;今天是二叉树~-CSDN博客&#xff0c;very重要&#xff01; 然后再过一遍&#xff08;理解怎么应用方法&#xff09;&#xff1a…

C++入门指南(上)

目录 ​编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好&#xff0c;我是BoBo仔吖&#xf…