18、责任链模式(Chain of Responsibility Pattern)

责任链模式,是用于避免请求发送者与多个请求处理者耦合在一起,让所有请求的处理者持有下一个对象的引用,从而将请求串联成一条链,在有请求发生时,可将请求沿着这条链传递,直到遇到该对象的处理器。用户只需将请求发送到责任链上即可,无须关心请求的处理细节和传递过程。

责任链模式包含以下三种角色。

  • Handler 接口:用于规定在责任链上具体要执行的方法。
  • AbstractHandler 抽象类:持有Handler实例并通过setHandler()和getHandler()将各个具体的业务Handler串联成一个责任链,客户端上的请求在责任链上执行。
  • Handler 业务处理类:用户根据具体的业务需求实现的业务逻辑。

服务端要针对客户端的请求实现用户鉴权、业务调用、结果反馈流程 UML设计图如下:

1)Handler 接口:

public interface Handler {void operator();
}

2)AbstractHandler 抽象类:

public abstract class AbstractHandler {private Handler handler;public Handler getHandler() {return handler;}public void setHandler(Handler handler) {this.handler = handler;}
}

3)Handler 业务处理类:

@Slf4j
public class AuthHandler extends AbstractHandler implements Handler {private String name;public AuthHandler(String name) {this.name = name;}@Overridepublic void operator() {log.info("user auth ...");if (getHandler() != null) {getHandler().operator();}}
}
@Slf4j
public class BusinessHandler extends AbstractHandler implements Handler {private String name;public BusinessHandler(String name) {this.name = name;}@Overridepublic void operator() {log.info("business handler ...");if (getHandler() != null) {getHandler().operator();}}
}
@Slf4j
public class ResponseHandler extends AbstractHandler implements Handler {private String name;public ResponseHandler(String name) {this.name = name;}@Overridepublic void operator() {log.info("response handler ...");if (getHandler() != null) {getHandler().operator();}}
}

4)责任链模式测试类:

public class ResponsibilityChainDemoTest {public static void main(String[] args) {AuthHandler authHandler = new AuthHandler("auth");BusinessHandler businessHandler = new BusinessHandler("buss");ResponseHandler responseHandler = new ResponseHandler("resp");authHandler.setHandler(businessHandler);businessHandler.setHandler(responseHandler);authHandler.operator();}
}

5)打印结果:

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

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

相关文章

华为或荣耀手机禁止强制升级鸿蒙系统的终极方法

需要有数据传输的usb线.打开usb调试模式. 进这个链接下载华为ADB一键卸载VS重装软件 按里面的视频说明,输入88 然后回车即可 https://download.csdn.net/download/viqecel/12161462

SVN版本回退

文章目录 SVN版本回退 SVN版本回退 一、revert to this version和revert to this version的区别: 基于4674版本执行"revert to this version"操作效果: 基于4674版本执行"revert changes from this version"操作效果&#xff1…

推荐开源项目-网络应用协议框架Socket.D

基于事件和语义消息流的网络应用协议 Socket.D 0 代码仓库地址1 该开源项目特点2 项目结构3 核心理念-协议帧Frame4 结束语 0 代码仓库地址 https://gitee.com/noear/socketd 1 该开源项目特点 代码风格优雅文档说明齐全测试用例非常人性化上手快,代码用例很多代…

JDBC链接MySQL,实现对Goods表的增删改查并封装JDBC

项目目录结构 数据库配置 1.创建goods表 2.创建goods实体 package homework.MyJDBC;public class Goods {private int id;private String gId;private String gName;private float gPrice;private int gNum;public int getId() {return id;}public void setId(int id) {this.i…

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

晶圆划片机助力LED陶瓷基板高效切割:科技提升产业新高度

博捷芯半导体划片机在LED陶瓷基板制造领域,晶圆划片机作为一种先进的切割工具,正在为提升产业效率和产品质量发挥重要作用。通过精确的切割工艺,晶圆划片机将LED陶瓷基板高效地切割成独立的芯片,为LED产业的快速发展提供了有力支持…

ViT:视觉 Transformer

ViT:视觉 Transformer 网络结构Transformer 编码器MLP 头CNN 和 Transformer 网络结构 Transformer 的优势:注意力机制相当于一个多标签检索系统,位置嵌入能知道每个单词的位置,而且适合并行。 尝试把 Transformer 迁移到视觉领…

鸿蒙(HarmonyOS)应用开发——简易版轮播图

简述 轮播图在应用中,已经很常见的展现方式。像uniapp、iview,viewUI等前端组件框架,都提供了轮播图组件。那么在harmonyOS中,如果要实现轮播,我们是使用swiper 组件 swiper组件 swiper 组件是一种容器组件。它提供…

jmeter接口自动化测试通过csv文件读取用例并执行测试

最近在公司测试中经常使用jmeter这个工具进行接口自动化,简单记录下~ 一、在csv文件中编写好用例 首先在csv文件首行填写相关参数(可根据具体情况而定)并编写测试用例。脚本可通过优先级参数控制执行哪些接口,通过端口参数同时执…

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

【项目资源下载】 本篇配套直接打开可用的项目包地址,欢迎下载: https://download.csdn.net/download/weixin_41697242/88612084 【背景】 想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上: chomedriver下载地址:淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址:如何降级和安装旧版本的C…

代码随想录刷题题Day11

刷题的第十一天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C / Python Day11 任务 ● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代 1 二叉树理论基础 1.1 二叉树的种类 (1&…

js基础:简介、变量与数据类型、流程循环控制语句、数组及其api

JS基础:简介、变量与数据类型、流程循环控制语句、数组及其api 一、简介 1、js概述 tip:JavaScript是什么? 有什么作用? JavaScript(简称JS)是一种轻量级的、解释性的编程语言,主要用于在网页…

React系列:实现子组件A->父组件-子组件B变量流传

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站:vip.zsqt.cc React系列总结 🎈useState的使用 创建响应式变量的时候,在react是需要使用u…

手机网站支付有风险吗?

这是一个在当今数字化时代中,消费者们常常会提出的问题。随着科技的发展和移动设备的普及,越来越多的商家开始接受在线支付,这无疑为消费者提供了极大的便利。然而,与此同时,也伴随着一些潜在的风险。本文将探讨手机网…

0012Java程序设计-ssm医院预约挂号及排队叫号系统

文章目录 **摘** **要**目 录系统实现5.2后端功能模块5.2.1管理员功能模块5.2.2医生功能模块 开发环境 摘 要 网络的广泛应用给生活带来了十分的便利。所以把医院预约挂号及排队叫号管理与现在网络相结合,利用java技术建设医院预约挂号及排队叫号系统,实…

Nginx安装【保姆级别】

目录 1.Nginx开源版本安装💕💕💕 2.传到linux💕💕💕 3.在linux上安装 💕💕💕 4.启动Nginx 💕💕💕 5.安装成系统服务 &#x1f495…

Dockerfile创建镜像INMP+wordpress

Dockerfile创建镜像INMPwordpress 需要哪些呢: Nginx 172.111.0.10 docker-nginx Mysql 172.111.0.20 docker-mysql PHP 172.111.0.30 docker-PHP 开始实验: 创建各级目录,他们各自的包和配置文件必须要在同一目录下才可以生效&…

Fiddler中AutoResponder的简单使用

AutoResponder,自动回复器,用于将 HTTP 请求重定向为指定的返回类型。 这个功能有点像是一个代理转发器,可以将某一请求的响应结果替换成指定的资源,可以是某个页面也可以是某个本地文件 1.使用 打开“Fiddler”,点击…

掌握iText:轻松处理PDF文档-高级篇-加密和解密

前言 iText作为一个功能强大、灵活且广泛应用的PDF处理工具,在实际项目中发挥着重要作用。通过这些文章,读者可以深入了解如何利用iText进行PDF的创建、编辑、加密和提取文本等操作,为日常开发工作提供了宝贵的参考和指导。 掌握iText&#…