当前位置: 首页 > news >正文

设计模式之职责链模式

什么是职责链模式

    职责链模式是避免请求发送者与接受者耦合在一起,让多个对象都可以接受到请求,从而将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理为止。
    职责链模式包含以下几个角色:
        Handler(抽象处理者):定义处理请求的接口,一般是抽象类。由于不同的具体处理类处理请求的方式不同,因此在其中定义抽象处理请求的方法。因为每一个处理这的下家还是处理者,因此在抽象处理者中定义一个抽象处理者类型的对象作为下家的引用。
        ConcreteHandler(具体处理者):是抽象处理者的子类,实现了抽象处理者中定义的抽象方法用于处理用户请求。具体处理者有两大作用:一是处理请求,不同的具体处理者以不同的形式实现抽象处理者的方法。二是转发请求,当前处理类可将请求转发给下家。
    职责链模式可以分为纯的职责链模式和不纯的职责链模式:
        纯的职责链模式:要求具体处理者只能在两个行为中选择一个,要么承担全部责任,要么将责任转发给下家,不允许出现一个具体处理者承担了一部分或全部责任还要将责任转发给下家。
        不纯的职责链模式:允许请求被一个具体处理者处理部分或全部后在转发给下家,也可以不被任何处理者所处理。

职责链模式的优缺点

优点

  1. 一个对象无需知道是其他哪个对象处理请求,降低了系统耦合。
  2. 请求处理对象只需维护一个指向下家的的引用,简化对象的相互连接。
  3. 给对象分派职责时更加灵活,可以通过在运行时对该链进行动态增加或修改改变处理请求的职责。
  4. 增加新的处理请求时无需修改代码,符合开闭原则。

缺点

  1. 不保证每个请求都会被处理。
  2. 太长的职责链涉及更多的处理对象,会降低系统性能。
  3. 可能会造成循环调用陷入死循环。

职责链模式的应用场景

  1. 有多个对象可以处理同一个请求,具体哪个对象处理在运行时决定。
  2. 不明确接受者的情况下,向多个对象中的一个提交请求。
  3. 可动态指定一组对象处理请求,客户端可以动态创建职责链处理请求,还可以改变处理请求的顺序。

职责链模式的案例

// 请求对象
public class PurchaseRequest implements Serializable {private int type = 0;private float price = 0.0f;private int id = 0;}// 抽象处理者
public abstract class Approver {Approver approver;String name;public Approver(String name) {this.name = name;}public void setApprover(Approver approver) {this.approver = approver;}public abstract void processRequest(PurchaseRequest purchaseRequest);}// 具体处理者
public class CollegeApprover extends Approver {public CollegeApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() < 5000 && purchaseRequest.getPrice() <= 10000) {System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");} else {approver.processRequest(purchaseRequest);}}
}public class DepartmentApprover extends Approver {public DepartmentApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() <= 5000) {System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");} else {approver.processRequest(purchaseRequest);}}}public class SchoolMasterApprover extends Approver {public SchoolMasterApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() > 30000) {System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");} else {approver.processRequest(purchaseRequest);}}
}public class ViceSchoolMasterApprover extends Approver {public ViceSchoolMasterApprover(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest purchaseRequest) {if (purchaseRequest.getPrice() < 10000 && purchaseRequest.getPrice() <= 30000) {System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");} else {approver.processRequest(purchaseRequest);}}
}

在这里插入图片描述

职责链模式在源码中的应用

org.apache.ibatis.plugin.InterceptorChain

// 在mybatis源码中,添加拦截器就是使用责任链模式
// pluginAll 通过这个方法可以添加定义好的拦截器实现
// 通过遍历 getInterceptors 就可以去请求每一个定义好的拦截器类
public class InterceptorChain {private final List<Interceptor> interceptors = new ArrayList<>();public Object pluginAll(Object target) {for (Interceptor interceptor : interceptors) {target = interceptor.plugin(target);}return target;}public void addInterceptor(Interceptor interceptor) {interceptors.add(interceptor);}public List<Interceptor> getInterceptors() {return Collections.unmodifiableList(interceptors);}}

相关文章:

设计模式之职责链模式

什么是职责链模式 职责链模式是避免请求发送者与接受者耦合在一起&#xff0c;让多个对象都可以接受到请求&#xff0c;从而将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理为止。     职责链模式包含以下几个角色&#xff1a;    …...

MySQL入门篇-MySQL 8.0 延迟复制

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL 延迟复制 概述 MySQL的复制一般都很快&#xff0c;虽然有时候因为 网络原因、大事务等原因造成延迟&#xff0c;但是这个无法人为控制。 生产中可能会存在主库误操作&#xff0c;导致数据被删除了&#xff0c;Oracl…...

FPGA时序约束与分析 --- 实例教程(1)

注意&#xff1a; 时序约束辅助工具或者相关的TCL命令&#xff0c;都必须在 open synthesis design / open implemention design 后才能有效运行。 1、时序约束辅助工具 2、查看相关时序信息 3、一般的时序约束顺序 1、 时序约束辅助工具&#xff08;1&#xff09;时序约束编辑…...

go深拷贝和浅拷贝

1、深拷贝&#xff08;Deep Copy&#xff09;拷贝的是数据本身&#xff0c;创造一个样的新对象&#xff0c;新创建的对象与原对象不共享内存&#xff0c;新创建的对象在内存中开辟一个新的内存地址&#xff0c;新对象值修改时不会影响原对象值。既然内存地址不同&#xff0c;释…...

linux网络系统层面的配置、管理及操作命令汇总

前几篇文章一一介绍了LINUX进程管理控制命令&#xff0c;关于linux系统中的软件包管理内容等&#xff0c;作为一名运维工程师&#xff0c;前两天刚处理了一起linux网络层面的情况&#xff0c;那么今天这篇文章就以linux网络层面为主题吧。当说到linux网络系统层面&#xff0c;e…...

R数据分析:孟德尔随机化中介的原理和实操

中介本身就是回归&#xff0c;基本上我看到的很多的调查性研究中在中介分析的方法部分都不会去提混杂&#xff0c;都是默认一个三角形画好&#xff0c;中介关系就算过去了&#xff0c;这里面默认的逻辑就是前两步回归中的混杂是一样的&#xff0c;计算中介效应的时候就自动消掉…...

【C++】 类和对象 (下)

文章目录&#x1f4d5;再谈构造函数1. 构造函数体赋值2. 初始化列表3. explicit 关键字&#x1f4d5;static 成员1. 概念2. static 成员变量3. static 成员函数&#x1f4d5; 友元1. 友元函数2. 友元类&#x1f4d5;内部类&#x1f4d5;编译器优化&#x1f4d5;再谈构造函数 1…...

asp获取毫秒时间戳的方法 asp获取13位时间戳的方案

一、背景。时间戳就是计算当前与"1970-01-01 08:00:00"的时间差&#xff0c;在asp中通常是使用Datediff函数来计算两个日期差&#xff0c;代码&#xff1a;timestamp Datediff("s", "1970-01-01 08:00:00",now)返回结果&#xff1a;1675951060可…...

Python基础篇(十五)-- Python程序接入MySQL数据库

程序运行时&#xff0c;数据都在内存中&#xff0c;程序终止时&#xff0c;需要将数据保存到磁盘上。为了便于程序保存和读取&#xff0c;并能直接通过条件快速查询到指定数据&#xff0c;数据库(Database)应运而生&#xff0c;本篇主要学习使用Python操作数据库&#xff0c;在…...

程序员不得不知道的 API 接口常识

说实话&#xff0c;我非常希望自己能早点看到本篇文章&#xff0c;大学那个时候懵懵懂懂&#xff0c;跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写。 至今我仍清晰地记得&#xff0c;那个电商教程是怎么定义接口的&#xff1a; 管它是增加、修改、删除、带参查询…...

【项目精选】基于Java的银行排号系统的设计与实现

银行排号系统是为解决一些服务业营业大厅排队问题而设计的&#xff0c;它能够有效地提高工作人员的工作效率&#xff0c;也能够使顾客合理的安排等待时间&#xff0c;让顾客感到服务的公平公正。论文首先讨论了排号系统的背景、意义、应用现状以及研究与开发现状。本文在对C/S架…...

前端 基于 vue-simple-uploader 实现大文件断点续传和分片上传

文章目录一、前言二、后端部分新建Maven 项目后端pom.xml配置文件 application.ymlHttpStatus.javaAjaxResult.javaCommonConstant.javaWebConfig.javaCheckChunkVO.javaBackChunk.javaBackFileList.javaBackChunkMapper.javaBackFileListMapper.javaBackFileListMapper.xmlBac…...

解决报错: ERR! code 128npm ERR! An unknown git error occurred

在github下载的项目运行时&#xff0c;进行npm install安装依赖时&#xff0c;出现如下错误&#xff1a;npm ERR! code 128npm ERR! An unknown git error occurrednpm ERR! command git --no-replace-objects ls-remote ssh://gitgithub.com/nhn/raphael.gitnpm ERR! gitgithu…...

聊城高新技术企业认定7项需要注意的问题 山东同邦科技分享

聊城高新技术企业认定7项需要注意的问题 山东同邦科技分享 山东省高新技术企业认定办公室发布《关于开展2021年度本市高新技术企业认定管理工作的通知》&#xff0c;高企认定中有哪些问题需要注意呢&#xff1f;下面我们一起来看一下。 一、知识产权 知识产权数量和质量双达…...

菊乐食品更新IPO招股书:收入依赖单一地区,规模不及认养一头牛

近日&#xff0c;四川菊乐食品股份有限公司&#xff08;下称“菊乐食品”&#xff09;预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市&#xff0c;保荐机构为中信建投证券。据贝多财经了解&#xff0c;这已经是菊乐食品第四次冲刺A股上市&#xff0c;此前三次均未能…...

Elasticsearch安装IK分词器、配置自定义分词词库

一、分词简介 在Elasticsearch中&#xff0c;假设搜索条件是“华为手机平板电脑”&#xff0c;要求是只要满足了其中任意一个词语组合的数据都要查询出来。借助 Elasticseach 的文本分析功能可以轻松将搜索条件进行分词处理&#xff0c;再结合倒排索引实现快速检索。Elasticse…...

Linux嵌入式开发——shell脚本

文章目录Linux嵌入式开发——shell脚本一、shell脚本基本原则二、shell脚本语法2.1、编写shell脚本2.2、交互式shell脚本2.3、shell脚本的数值计算2.4、test命令&&运算符||运算符2.5、中括号[]判断符2.6、默认变量三、shell脚本条件判断if thenif then elsecase四、she…...

CV【5】:Layer normalization

系列文章目录 Normalization 系列方法&#xff08;一&#xff09;&#xff1a;CV【4】&#xff1a;Batch normalization Normalization 系列方法&#xff08;二&#xff09;&#xff1a;CV【5】&#xff1a;Layer normalization 文章目录系列文章目录前言2. Layer normalizati…...

跳跃游戏 II 解析

题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - 1] 的…...

易基因|猪肠道组织的表观基因组功能注释增强对复杂性状和人类疾病的生物学解释:Nature子刊

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2021年10月6日&#xff0c;《Nat Commun》杂志发表了题为“Pig genome functional annotation enhances the biological interpretation of complex traits and human disease”的研究论文…...

01- NumPy 数据库 (机器学习)

numpy 数据库重点: numpy的主要数据格式: ndarray 列表转化为ndarray格式: np.array() np.save(x_arr, x) # 使用save可以存一个 ndarray np.savetxt(arr.csv, arr, delimiter ,) # 存储为 txt 文件 np.array([1, 2, 5, 8, 19], dtype float32) # 转换…...

RapperBot僵尸网络最新进化:删除恶意软件后仍能访问主机

自 2022 年 6 月中旬以来&#xff0c;研究人员一直在跟踪一个快速发展的 IoT 僵尸网络 RapperBot。该僵尸网络大量借鉴了 Mirai 的源代码&#xff0c;新的样本增加了持久化的功能&#xff0c;保证即使在设备重新启动或者删除恶意软件后&#xff0c;攻击者仍然可以通过 SSH 继续…...

拦截器interceptor总结

拦截器一. 概念拦截器和AOP的区别&#xff1a;拦截器和过滤器的区别&#xff1a;二. 入门案例2.1 定义拦截器bean2.2 定义配置类2.3 执行流程2.4 简化配置类到SpringMvcConfig中一. 概念 引入&#xff1a; 消息从浏览器发送到后端&#xff0c;请求会先到达Tocmat服务器&#x…...

轻松实现微信小程序上传多文件/图片到腾讯云对象存储COS(免费额度)

概述 对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是腾讯云提供的一种存储海量文件的分布式存储服务&#xff0c;用户可通过网络随时存储和查看数据。个人账户首次开通COS可以免费领取50GB 标准存储容量包6个月&#xff08;180天&#xff09;的额度。…...

Golang中defer和return的执行顺序 + 相关测试题(面试常考)

参考文章&#xff1a; 【Golang】defer陷阱和执行原理 GO语言defer和return 的执行顺序 深入理解Golang defer机制&#xff0c;直通面试 面试富途的时候&#xff0c;遇到了1.2的这个进阶问题&#xff0c;没回答出来。这种题简直是 噩梦\color{purple}{噩梦}噩梦&#xff0c;…...

谁说菜鸟不会数据分析,不用Python,不用代码也轻松搞定

作为一个菜鸟&#xff0c;你可能觉得数据分析就是做表格的&#xff0c;或者觉得搞个报表很简单。实际上&#xff0c;当前有规模的公司任何一个岗位如果没有数据分析的思维和能力&#xff0c;都会被淘汰&#xff0c;数据驱动分析是解决日常问题的重点方式。很多时候&#xff0c;…...

php mysql保健品购物商城系统

目 录 1 绪论 1 1.1 开发背景 1 1.2 研究的目的和意义 1 1.3 研究现状 2 2 开发技术介绍 2 2.1 B/S体系结构 2 2.2 PHP技术 3 2.3 MYSQL数据库 4 2.4 Apache 服务器 5 2.5 WAMP 5 2.6 系统对软硬件要求 6 …...

Vue3电商项目实战-首页模块6【22-首页主体-补充-vue动画、23-首页主体-面板骨架效果、4-首页主体-组件数据懒加载、25-首页主体-热门品牌】

文章目录22-首页主体-补充-vue动画23-首页主体-面板骨架效果24-首页主体-组件数据懒加载25-首页主体-热门品牌22-首页主体-补充-vue动画 目标&#xff1a; 知道vue中如何使用动画&#xff0c;知道Transition组件使用。 当vue中&#xff0c;显示隐藏&#xff0c;创建移除&#x…...

linux 使用

一、操作系统命令 1、版本命令&#xff1a;lsb_release -a 2、内核命令&#xff1a;cat /proc/version 二、debian与CentOS区别 debian德班和CentOS是Linux里两个著名的版本。两者的包管理方式不同。 debian安装软件是用apt(apt-get install)&#xff0c;而CentOS是用yum de…...

基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…...

dw怎么做别人可以看的网站/黄页网推广服务

Mysql-5.7.20 升级 mysql-8.0.14-1 操作前建议先查阅以下网页初步了解Mysql版本升级信息 https://blog.csdn.net/u012946310/article/details/81880050 一、查看环境信息 cat /etc/redhat-release mysql -V 二、备份数据库 &#xff08;-A 参数是备份全部数据库的数据和结构&…...

北京建设教育协会官方网站/百度直播平台

除了Redis&#xff0c;还有哪些组件可用 redis&#xff1a;主业是一个缓存数据库&#xff08;存储key-value&#xff09;&#xff0c;性能非常好&#xff0c;响应快&#xff0c;低延时。还能实现分布式锁&#xff0c;还能实现发布-订阅功能&#xff0c;我们可以订阅上几个通道…...

个人可以做社区网站有哪些/深圳百度快速排名优化

上一篇我们学习了菜单的基本编程&#xff0c;本篇来了解一下通用对话框的使用。Windows系统之所以是目前最流行的桌面系统&#xff0c;也是因为Windows有一套标准化&#xff0c;统一友好的交互界面&#xff0c;比如菜单、工具栏、状态栏以及各个控件。当然除了这些单独的控件之…...

东莞疾控最新通告今天/短视频入口seo

参考链接 点击按钮直接上传文 /*批量导入*//*#load:为按钮,点击后生成一个隐藏的input file标签*/$(#load).after(<input type"file" id"load_xls" name"file" style"display:none" onchange "uploadFile()">);$(#loa…...

php可以做网站布局吗/我要登录百度

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.Floyd求最短路2.Dijkstra求最短路&#xff08;堆优化版&#xff09;1.Floyd求最短路 题目 链接…...

重庆本地建站/郑州seo外包阿亮

1.首先你要有一个github账号,如果没有的话,登录网址注册&#xff1a;https://github.com/ 2.进入你的github 点击右上角的号 选择 New repository 3.取一个Repository name&#xff0c;不能和自己的其他项目冲突 PS&#xff1a;Repository name: 仓库名称Description(可选…...