设计模式——职责链(责任链)模式

目录

职责链模式

小俱求实习

结构图

实例

职责链模式优点

职责链模式缺点

使用场景

1.springmvc流程

​2.mybatis的执行流程

3.spring的过滤器和拦截器


职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

 一个请求有多个对象可以处理,但每个对象的处理条件或权限不同,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

概念可能不容易理解,我先举一个例子说说亲身体会的一件事,就叫小俱求实习吧。

小俱求实习

背景:2024上半年  小俱正值大三下学期

在这个92✌到处出没的社会市场下,双非一本的小俱心感没有任何优势,苦苦找实习,实习要求虽说没有秋招正式高,在苦苦投递十几大厂下,做测评、做笔试.....不知今年大厂对双非学历究竟如何评估,终于小俱迎来了美团、腾讯云智、游族的面试......每次面试后,小俱深知自己哪块还没有学到位,甚至有的问题没有听过,小俱最终进入人才池。双非就真的菜吧......小俱仍不甘心,继续沉淀......

最终小俱通过boss投递小厂,甘心为公司做牛做马,同时马不停蹄的巩固知识,通过二面,收到了北京一家实习offer,接着有重庆、成都。

小俱满怀期待,兴致勃勃去给辅导员请假!(划重点!)

在辅导员要求提交几种资料后

辅导员回复:我这里只能批准3天假期,你出去实习这件事必须和领导商量。

好,小俱等待批假......

过了一天,辅导员说:领导说他只能批7天假,有的课程还没有完,你这每周需要回来一次,经过我们的开会,批准不同意。

啊!小俱说那我每周请假,每周回来,辅导员仍不同意!

小俱苦苦说机会来之不易,希望领导理解通融!

辅导员其实仅仅传达了领导的命令,理智的小俱不麻烦年轻的辅导员,直接自己找领导。

于是小俱亲自找到领导: 

领导:我这个只能批7天的假,根据目前的教学管理,不允许实习,再说,你实习地点离学校远,每次请7天假也不现实,你这个就属于请长假,你需要找大领导,他同意就行!

小俱人不罢休,去找大领导!

大领导:根据目前的教学管理规定,大三不允许实习............(此处省略各种理由,态度好,很委婉),我们非常支持你们实习,你们有这种意识也非常好,我很支持!(.....好,说了很多,就是不给假。。。)

最终小俱实习失败。

小俱一级一级的找领导,最终失败,但小俱调整心态,继续沉淀。

现在大概理解了职责链模式了吧!

结构图

实例

结构图,举例请假、加薪场景

管理者抽象类  Manager 

//管理者抽象类
abstract class Manager {protected String name;public Manager(String name) {this.name = name;}//设置管理者上级protected Manager superior;public void setSuperior(Manager superior){this.superior = superior;}//请求申请public abstract void requsetApplications(Request request);}

 申请Request类

//申请
class Request{//申请类别private String requestType;//申请内容private String requestContent;//数量private int number;public void setRequestType(String requestType) {this.requestType = requestType;}public void setRequestContent(String requestContent) {this.requestContent = requestContent;}public void setNumber(int number) {this.number = number;}public String getRequestType() {return requestType;}public String getRequestContent() {return requestContent;}public int getNumber() {return number;}
}

普通经理 CommonManager 

//普通经理
class  CommonManager extends Manager{public CommonManager(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="请假"&& request.getNumber()<=2){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+ request.getNumber()+"天,批准");}else {if (this.superior!=null){this.superior.requsetApplications(request);}}}
}

 总监Director 

//总监
class  Director extends Manager{public Director(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="请假"&&request.getNumber()<=5){System.out.println(this.name+":"+request.getRequestContent()+"数量:" + request.getNumber()+"天,批准");}else {if (this.superior!=null){this.superior.requsetApplications(request);}}}
}

总经理GeneralManager  

//总经理  都会处理
class GeneralManager extends Manager{public GeneralManager(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="请假"){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,批准");}else if (request.getRequestType()=="加薪"&&request.getNumber()<=5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,批准");}else if (request.getRequestType()=="加薪"&&request.getNumber()>5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,再说吧");}}
}

 客户端:

class Test{public static void main(String[] args) {CommonManager manager = new CommonManager("经理");Director director = new Director("总监");GeneralManager generalManager = new GeneralManager("总经理");//设置每个级别的上级manager.setSuperior(director);director.setSuperior(generalManager);Request request = new Request();request.setRequestType("请假");request.setRequestContent("小菜请假");request.setNumber(1);manager.requsetApplications(request);Request request2 = new Request();request2.setRequestType("请假");request2.setRequestContent("小菜请假");request2.setNumber(4);manager.requsetApplications(request2);Request request3 = new Request();request3.setRequestType("加薪");request3.setRequestContent("小菜加薪");request3.setNumber(1000);manager.requsetApplications(request3);Request request4 = new Request();request4.setRequestType("加薪");request4.setRequestContent("小菜加薪");request4.setNumber(6000);manager.requsetApplications(request4);}
}

 运行结果

职责链模式优点

「降低了对象之间的耦合度」

责任链模式让发送者不需要知道对方的具体是哪个处理者处理请求。

「增强了系统的可扩展性」

可以根据需要增加新的请求处理类,满足开闭原则。

「增强了给对象指派职责的灵活性」

当工作流程发生变化,客户端可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。

「责任链简化了对象之间的连接」

每个对象只需保持一个指向其后继者的引用。

「责任分担」

每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成。

职责链模式缺点

  • 不能保证每个请求一定被处理。由于一个「请求没有明确的接收者」,该请求可能一直传到链的末端都得不到处理。
  • 当责任链比较长的时候,请求的处理可能涉及多个处理对象,系统性能受影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会造成循环调用。

使用场景

1.springmvc流程

就拿这个springMvc的执行流程来说,全部流程就组成了一个链条。每一个步骤就是一个结点,每个结点都会有对应的处理方法,每个结点处理完成之后,就会进入下一个结点。一旦某个结点出现异常,那么当前的链路就会停止,当前请求中断。

2.mybatis的执行流程

mybatis的执行流程也是通过这个责任链模式,如首先会创建这个SqlSessionFactory,然后通过这个工厂创建一个SqlSession,这个SqlSession只是一个门面模式,会通过Executer执行增删改查的操作,然后一个Handler用于设置参数,一个Handler用于返回结果集,最后通过这个StatementHandler将执行结果获取。里面的整个步骤就相当于形成了一个链条,执行完当前结点就会进入下一个结点,如果出现异常,链条终止往下执行。

3.spring的过滤器和拦截器

spring里面的这个过滤器链路的调用,以及拦截器的链路调用,也是采用这种责任链模式

 

 

参考文章:http://t.csdnimg.cn/rkTNL

 

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

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

相关文章

github设置项目分类

https://www.php.cn/faq/541957.html https://docs.github.com/zh/repositories/working-with-files/managing-files/creating-new-files

什么是回表,如何解决回表问题

下面表中:主键id是聚簇索引&#xff0c;name是辅助索引。 执行这样一条SQL: select name from A where name"s;name字段是有索引&#xff0c;所以MYSQL在通过name进行査询的时候&#xff0c;是需要扫描两颗Btree树的。 第一遍:先通过二级索引定位主键值1。第二遍:根据主键…

免费发布web APP的四个途径(Python和R)

免费发布数据分析类&#x1f310;web APP的几个途径&#x1f4f1; 数据分析类web APP目前用来部署生信工具&#xff0c;统计工具和预测模型等&#xff0c;便利快捷&#xff0c;深受大家喜爱。而一个免费的APP部署途径&#xff0c;对于开发和测试APP都是必要的。根据笔者的经验…

word-形状绘制、smartart、visio

一、人员架构图绘制 小技巧&#xff1a; 1、ctrlshift水平复制 2、点击图形&#xff0c;右键设置为默认形状 3、插入-形状-右键-锁定绘图模式&#xff0c;按esc退出状态 4、插入-形状-新建绘图画布&#xff0c;代替组合问题 画布中存在锚点&#xff0c;便于直线连接 二、s…

网络安全相关面试题(hw)

网络安全面试题 报错注入有哪些函数 updatexml注入 载荷注入 insert注入 updata注入 delete注入 extractvalue&#xff08;&#xff09;注入 注入防御方法 涵数过滤 直接下载相关防范注入文件&#xff0c;通过incloud包含放在网站配置文件里面 PDO预处理,从PHP 5.1开始&…

electron中BrowserWindow的show事件没有触发踩坑记录

class ElectronApi {static mainWindow;//主窗口createWindow() {try {// Create the browser window.this.mainWindow new BrowserWindow({width: 1200,height: 800,minHeight: 800,minWidth: 1200,webPreferences: {preload: preloadPath,// nodeIntegration: true,// conte…

windows怎么复制文件到vmware 中ubantu虚拟机,vmware中的虚拟机怎么联网,NAT参数和DHCP参数。

目录 windows怎么复制文件到vmware 中ubantu虚拟机 vmware中的虚拟机怎么联网 NAT参数和DHCP参数。

Linux环境Docker安装,使用Docker搭建Mysql服务实战

1、环境&#xff1a;阿里云Linxu服务器 2、安装docker # 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data…

OpenSSL之API编程 - C/C++实现AES、DES、3DES、SM4对称加密算法

文章介绍 本文章介绍了OpenSSL计算对称加解密算法(AES、DES、3DES、SM4等)的相关接口&#xff0c;并使用C语言实现了AES和SM4加解密。 对称加解密算法 对称加密与非对称加密算法 OpenSSL介绍 openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有&#xff…

深度学习之基于YOLOV5的口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着全球公共卫生事件的频发&#xff0c;口罩成为了人们日常生活中不可或缺的一部分。在公共场所&am…

10、SpringBoot 源码分析 - 自动配置深度分析三

SpringBoot 源码分析 - 自动配置深度分析三 refresh和自动配置大致流程AutoConfigurationImportSelector的getAutoConfigurationEntry获取自动配置实体(重点)AutoConfigurationImportSelector的getCandidateConfigurations获取EnableAutoConfiguration类型的名字集合AutoConfig…

Android中JVM内存回收机制

文章目录 分代收集算法&#xff1a;新生代&#xff08;Young Generation&#xff09;老年代&#xff08;Old Generation&#xff09; 垃圾回收器&#xff1a;JVM常见三大回收算法&#xff1a;Mark-Sweep(标记清除)优点:缺点: 复制算法优点&#xff1a;缺点&#xff1a; Mark-Co…

ubuntu下交叉编译安卓FFmpeg 和 官方指导链接

将之前的编译方法在此记录 Linux系统&#xff1a;Ubuntu 18.04.6 LTS 交叉编译工具链&#xff1a;gcc-aarch64-linux-gnu gaarch64-linux-gnu ffmpeg版本&#xff1a;5.1.3 1.下载源码 ffmpeg官网&#xff1a;https://ffmpeg.org/download.html#releases 下载完成后&#x…

Edge浏览器“此页存在问题”解决思路

Edge浏览器显示“此页存在问题”解决思路 大家平时使用Edge浏览器时&#xff0c;是否和我一样会突然出现“此页存在问题”的情况&#xff1f; 经过百度查询后我找了一种情况和解决办法&#xff0c;能够大大减少这类问题的出现。出现“此页存在问题”可能是因为之前使用过软件…

每天一个数据分析题(三百四十一)

如何获取更多优质流量是电商行业中重要课题&#xff0c;下列哪些属于流量类指标 A. 平均访问深度 B. 跳失次数 C. 浏览量 D. 客单价 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案

Linux基础命令[27]-gpasswd

文章目录 1. gpasswd 命令说明2. gpasswd 命令语法3. gpasswd 命令示例3.1 不加参数3.2 -a&#xff08;将用户加入组&#xff09;3.3 -d&#xff08;从组中删除用户&#xff09;3.4 -r&#xff08;删除组密码&#xff09;3.5 -M&#xff08;多个用户一起加入组&#xff09;3.6 …

React中 将UI 视为树

当 React 应用程序逐渐成形时&#xff0c;许多组件会出现嵌套。那么 React 是如何跟踪应用程序组件结构的&#xff1f; React 以及许多其他 UI 库&#xff0c;将 UI 建模为树。将应用程序视为树对于理解组件之间的关系以及调试性能和状态管理等未来将会遇到的一些概念非常有用。…

Python教程:使用Python和PyQt编写进制转换器工具

1.介绍 在现代计算中&#xff0c;进制转换是一项常见且重要的任务。为了简化这个过程&#xff0c;我们也可以利用Python和PyQt自己写一个直观且易于使用的进制转换器工具。这个工具将支持二进制、八进制、十进制和十六进制的相互转换&#xff0c;并提供良好的用户界面和交互体…

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式&#xff0c;共十一种&#xff1a;…

MySQL---函数与约束

目录 一、函数 1. 字符串函数 2. 数值函数 3. 日期函数 4. 流程函数 5. 总结 二、约束 1. 概述 2. 约束演示 3. 外键约束 3.1 添加外键 3.2 删除外键 3.3 外键删除更新行为 4. 总结 一、函数 1. 字符串函数 命令如下所示&#xff1a; -- concat select concat("Hel…