【设计模式】我终于读懂了职责链模式。。。

news2024/11/23 22:27:28

文章目录

    • 🍪学校 OA 系统的采购审批项目
    • 🍪传统方案解决OA 系统审批,传统的设计方案(类图)
    • 🍪传统方案解决OA 系统审批问题分析
    • 🍪职责链模式基本介绍
    • 🍪职责链模式的原理类图
      • 🍪对原理类图的说明-即(职责链模式的角色及职责)
    • 🍪职责链模式解决OA 系统采购审批
    • 🍪debug看源码
    • 🍪职责链模式在SpringMVC 框架应用的源码分析
    • 🍪职责链模式的注意事项和细节

🍪学校 OA 系统的采购审批项目

需求是:采购员采购教学器材

  1. 如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000)
  2. 如果金额 小于等于 10000, 由院长审批 (5000<x<=10000)
  3. 如果金额 小于等于 30000, 由副校长审批 (10000<x<=30000)
  4. 如果金额 超过 30000 以上,有校长审批 ( 30000<x)

🍪传统方案解决OA 系统审批,传统的设计方案(类图)

在这里插入图片描述

🍪传统方案解决OA 系统审批问题分析

  1. 传统方式是:接收到一个采购请求后,根据采购金额来调用对应的 Approver (审批人)完成审批。
  2. 传统方式的问题分析 : 客户端这里会使用到 分支判断(比如 switch) 来对不同的采购请求处理, 这样就存在如下问题
    (1) 如果各个级别的人员审批金额发生变化,在客户端的也需要变化
    (2) 客户端必须明确的知道 有多少个审批级别和访问
  3. 这样 对一个采购请求进行处理 和 Approver (审批人) 就存在强耦合关系,不利于代码的扩展和维护

🍪职责链模式基本介绍

  1. 职责链模式(Chain of Responsibility Pattern), 又叫 责任链模式,为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。
  2. 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
  3. 这种类型的设计模式属于行为型模式

🍪职责链模式的原理类图

在这里插入图片描述

🍪对原理类图的说明-即(职责链模式的角色及职责)

  1. Handler : 抽象的处理者, 定义了一个处理请求的接口, 同时含义另外 Handler
  2. ConcreteHandlerA , B 是具体的处理者, 处理它自己负责的请求, 可以访问它的后继者(即下一个处理者), 如果可以处理当前请求,则处理,否则就将该请求交个 后继者去处理,从而形成一个职责链
  3. Request , 含义很多属性,表示一个请求

🍪职责链模式解决OA 系统采购审批

思路分析和图解(类图)

在这里插入图片描述

PurchaseRequest类,定义请求类

在这里插入图片描述

Approver类,定义同意审批接口

在这里插入图片描述

定义四个处理者

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Client类

在这里插入图片描述

运行结果

在这里插入图片描述

🍪debug看源码

首先实例化了请求类和四个处理类

在这里插入图片描述

之后需要将各个审批级别的下一个设置好 (处理人构成环形:保证每个审批都有最终处理人 )

在这里插入图片描述
在这里插入图片描述

最后丢给任何人处理

在这里插入图片描述

都会找到最终处理人(佟校长)

在这里插入图片描述

🍪职责链模式在SpringMVC 框架应用的源码分析

  1. SpringMVC-HandlerExecutionChain 类就使用到职责链模式

  2. 代码分析+Debug 源码+说明

DispatcherServlet类

在这里插入图片描述

doDispatch()方法

在这里插入图片描述

applyPreHandle()方法

在这里插入图片描述

mappedHandler.applyPreHandle 内部 得到了 HandlerInterceptor interceptor调用了拦截器的 interceptor.preHandle

如果又没拦截到,则调用triggerAfterCompletion方法

在这里插入图片描述
在这里插入图片描述

最后调用afterCompletion方法

再回到doDispatch()方法

在这里插入图片描述

他如果没有拿到,则调用mappedHandler.applyPostHandle 方法

在这里插入图片描述

mappedHandler.applyPostHandle 方法内部获取到拦截器,并调用拦截器的 interceptor.postHandle();

调来调去其实就是把这个类里面三个方法调用完了

在这里插入图片描述

  1. 对源码总结
    (1)springmvc 请求的流程图中,执行了 拦截器相关方法 interceptor.preHandler 等等
    (2)在处理 SpringMvc 请求时,使用到职责链模式还使用到适配器模式
    (3)HandlerExecutionChain 主要负责的是请求拦截器的执行和请求处理,但是他本身不处理请求,只是将请求分配给链上注册处理器执行,这是职责链实现方式,减少职责链本身与处理逻辑之间的耦合,规范了处理流程
    (4)HandlerExecutionChain 维护了 HandlerInterceptor 的集合, 可以向其中注册相应的拦截器.

🍪职责链模式的注意事项和细节

  1. 将请求和处理分开,实现解耦,提高系统的灵活性
  2. 简化了对象,使对象不需要知道链的结构
  3. 性能会受到影响,特别是在链比较长的时候,因此需控制链中最大节点数量,一般通过在 Handler 中设置一个最大节点数量,在 setNext()方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能
  4. 调试不方便。采用了类似递归的方式,调试时逻辑可能比较复杂
  5. 最佳应用场景:有多个对象可以处理同一个请求时,比如:多级请求、请假/加薪等审批流程、Java Web 中 Tomcat
    对 Encoding 的处理、拦截器

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

在这里插入图片描述

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

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

相关文章

Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

--------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义&#xff1a; Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标…

华为云 异构数据迁移

数据库和应用迁移 UGO&#xff08;Database and Application Migration UGO&#xff0c;以下简称为UGO&#xff09;是专注于异构数据库结构迁移的专业服务。可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法&#xff0c;通过数据库评估、对象迁移两大核…

本地电脑搭建Web服务器建立一个属于自己的网页该如何操作呢?

本地电脑搭建Web服务器并用cpolar发布至公网访问 文章目录 本地电脑搭建Web服务器并用cpolar发布至公网访问前言1. 首先在电脑安装PHPStudy、WordPress、cpolar2. 安装cpolar&#xff0c;进入Web-UI界面3. 安装wordpress4. 进入wordpress网页安装程序5. 利用cpolar建立的内网穿…

USB Server适用于哪些场景?

具体什么情况适合使用USB Server呢&#xff1f; 一句话&#xff0c; 只要企业内有多个USB设备&#xff0c;就可以考虑使用USB Server。 目前用USB Server比较多的&#xff0c; 主要还有以下三种情况&#xff0c; 虚拟机中要连接USB 必须使用USB Server 来实现加密狗或者前…

架构设计基础设施保障IaaS之网络

目录 1 DNS运用1.1 DNS功能作用1.2 DNS配置实践 2 DNS生产最佳实践方案2.1 全球加速功能2.2 不同运营商的加速方案2.3 全球业务高可用方案2.4 跨地域负载均衡 3 DNS域名劫持解决方案4 CDN剖析4.1 CDN原理4.2 缓存过期配置处理流程4.3 缓存配置规则 5 CDN运用6 CDN最佳实践方案6…

NSSCTF web 刷题记录1

文章目录 前言题目[GXYCTF 2019]禁止套娃方法一方法二 [NCTF 2019]Fake XML cookbook[NSSRound#7 Team]ec_RCE[NCTF 2018]Flask PLUS 前言 今天是2023.9.3&#xff0c;大二开学前的最后一天。老实说ctf的功力还是不太够做的题目太少&#xff0c;新学期新气象。不可急于求成&am…

批量重命名、转换格式,让你的视频焕然一新!

你是否曾经遇到过需要批量重命名或转换视频格式的情况&#xff1f;在这个数字化时代&#xff0c;我们经常需要处理大量的视频文件&#xff0c;但是命名混乱、格式不兼容等问题常常让我们头疼。现在&#xff0c;我们为你提供了一个全面、高效的解决方案&#xff0c;让你的视频管…

JVM类的加载相关的问题

JVM类的加载相关的介绍 学习类的加载的加载过程对深入理解JVM有十分重要的作用&#xff0c;下面就跟我一起学习JVM类的加载过程吧&#xff01; 文章目录 JVM类的加载相关的介绍一、类的加载过程二、双亲委派机制1、类加载器的种类2、为什么JVM要分成不同的类的加载器3、类的加…

AIGC风暴席卷出版业,探索人工智能与创造力的融合

随着时代的不断发展&#xff0c;人工智能技术正逐渐深入并改变着各行各业&#xff0c;其中包括传统的出版行业。最近独家连载于微信读书的刑侦小说《马一鸣从警记》的成功&#xff0c;以及其中使用到的AI工具在策划、编校、推广和封面设计上的辅助&#xff0c;不仅为出版行业带…

windows下的mysql安装部署和配置环境

目录 一、下载&#xff08;mysql下载链接&#xff09; 1.进入官网选择下载 2.拉到最底下&#xff0c;选择社区版下载 3.选择mysql community server 4.选择数据库版本&#xff0c;以及系统和安装方式&#xff08;这里我选的msi&#xff09; 5.直接点击no thanks,just sta…

Unity 安卓(Android)端AVProVideo插件播放不了视频,屏幕一闪一闪的

编辑器运行没有问题&#xff0c;但是安卓就有问题&#xff0c;在平板上运行就会报错&#xff1a; vulkan graphics API is notsupported 说不支持Vulkan图形API,解决方法&#xff1a;把Vulkan删除掉

NPM 常用命令(二)

目录 1、npm bugs 1.1 配置 browser registry 2、npm cache 2.1 概要 2.2 详情 2.3 关于缓存设计的说明 2.4 配置 cache 3、 npm ci 3.1 描述 3.2 配置 install-strategy legacy-bundling global-style omit strict-peer-deps foreground-scripts ignore-s…

文心一言 VS 讯飞星火 VS chatgpt (86)-- 算法导论8.2 3题

三、用go语言&#xff0c;假设我们在 COUNTING-SORT的第 10行循环的开始部分&#xff0c;将代码改写为: 10 for j 1 to A.length 试证明该算法仍然是正确的。它还稳定吗? 文心一言&#xff1a; 首先&#xff0c;让我们先明确 COUNTING-SORT 算法的基本思想。COUNTING-SOR…

Java学习笔记之----I/O(输入/输出)二

【今日】 孩儿立志出乡关&#xff0c;学不成名誓不还。 文件输入/输出流 程序运行期间&#xff0c;大部分数据都在内存中进行操作&#xff0c;当程序结束或关闭时&#xff0c;这些数据将消失。如果需要将数据永久保存&#xff0c;可使用文件输入/输出流与指定的文件建立连接&a…

kubernetes/cluster/addons/fluentd-elasticsearch

#发文福利# 一、前言 kubernetes 1.23搭建EFK所用到的yaml文件&#xff0c;本帖均来自kubernetes官方&#xff0c;且没做修改。 https://github.com/kubernetes/kubernetes/tree/release-1.23/cluster/addons/fluentd-elasticsearch 二、EFK 原版yaml 1、create-logging-na…

【Unity3D】UI Toolkit元素

1 前言 UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger&#xff0c;UI Toolkit容器 中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器&#xff0c;本文将介绍 UI Toolkit 中的元素&#xff0c;主要包含 Label、Button、TextField、Toggle、Ra…

Nerd Font 字体安装

一、Nerd Font 是什么&#xff1f; Nerd Font 是为开发人员准备的&#xff0c;具有大量字形&#xff08;图标&#xff09;的字体。特别是从流行的“标志性字体”中添加大量额外的字形&#xff0c;如Font Awesome、Devicons、Octicons等。 二、安装步骤 1.克隆仓库 git clon…

【上海迪士尼度假区】技术解决方案

开源平台地址Giteehttps://gitee.com/issavior/disney 技术解决方案 1. 背景2. 技术架构3. 业务架构3.1 架构图3.2 说明 4. 技术能力4.1 自研中间件4.2 定制化中间件 5. 领域模型6. 数据模型7. 交易链路8. 状态机8. 接口文档 1. 背景 上海迪士尼度假区已运营近10年&#xff0c…

【微服务部署】四、Jenkins一键打包部署NodeJS(Vue)前端项目步骤详解

本文介绍使用Jenkins一键将NodeJS&#xff08;Vue&#xff09;前端项目打包并上传到生产环境服务器&#xff0c;这里使用的是直接打包静态页面&#xff0c;发送到远程服务器Nginx配置目录的方式&#xff0c;首先确保服务器环境配置好&#xff0c;安装Nginx&#xff0c;运行目录…

微软拼音输入法配置小鹤双拼

实现微软拼音能够使用小鹤双拼&#xff0c;再也不用下载搜狗输入法了 winR输入regedit&#xff0c;打开注册表 计算机\HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS新建字符串值&#xff1a; 名字为&#xff1a;UserDefinedDoublePinyinScheme0值为 &#…