设计模式20——职责链模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

职责链模式(Chain of Responsibility)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

1、使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2、职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。
3、可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

1.1、直观的理解

假设有三个处理请求者,它们组成一个处理链1-》2-》3:

当遇到请求后的处理步骤如下:

可以看到,如果前面的处理请求者能开处理此次请求,那么就不会再把请求传递到后面。这很像if-else语句。

1.2、主要角色:

  • 处理请求者:处理请求的抽象类或接口 + 处理请求类
  • 发起请求者

(注:请求链要按需填装配置以后才可以正常使用)

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 有多个对象可以处理一个请求,并且具体是哪个对象处理是在运行时自动确定
  • 你想在不明确指定哪个接收者时,向多个对象中的一个提交一个请求
  • 可处理一个请求的对象集合应该被动态指定

二、简单举例

现在有三个处理请求者A、B、C,它们分别能够处理的请求参数的范围为:0到9、10到19、20到29。以处理者请求A为头将他们按顺序串在一起,然后请求发起者给处理者请求A发送4个请求。例子简单就不再详细分析了。你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

处理请求者的抽象类:

abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}

处理请求类A:

public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 0 && request < 10) {System.out.println(this.getClass().getSimpleName() + "处理请求" + request);} else if (this.successor != null) {this.successor.handleRequest(request);}}
}

处理请求类B:

public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println(this.getClass().getSimpleName() + "处理请求" + request);} else if (this.successor != null) {this.successor.handleRequest(request);}}
}

处理请求类C:

public class ConcreteHandlerC extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 20 && request < 30) {System.out.println(this.getClass().getSimpleName() + "处理请求" + request);} else if (this.successor != null) {this.successor.handleRequest(request);}}
}

主程序(发起请求的类):

public class Main {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();Handler handlerC = new ConcreteHandlerC();//串联ABChandlerA.setSuccessor(handlerB);handlerB.setSuccessor(handlerC);//发送请求int[] requests = {1, 14, 25, 36};for (int request : requests) {handlerA.handleRequest(request);}}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

FreeRTOS【8】二值信号量使用

1.开发背景 FreeRTOS 提供了队列可以在线程间快速交换信息&#xff0c;那么还有没有其他交互渠道&#xff1f;答案是有的&#xff0c;相对于队列传递信息&#xff0c;还有更轻量级的线程唤醒操作&#xff0c;那就是信号量&#xff0c;而二值信号量就是最简单的一种。 二值信号量…

解读一下15.52.34.160/27

IP地址15.52.34.160/27可以分解为两部分来解读&#xff1a; IP地址: 15.52.34.160 这是分配给网络接口的地址&#xff0c;用于在网络中标识一个特定的设备。 子网掩码: /27 这表示子网掩码是27位长&#xff0c;意味着网络部分占据了IP地址的前27位&#xff0c;剩下的5位用于主…

C++模拟实现stack和queue

1 stack 1.1概念 stl栈 1.2栈概念 1.3代码 2 queue 2.1概念 stl队列 2.2队列概念 2.3代码

【python】实用性python脚本链接汇总

目标检测方向–python脚本 标签处理 链接备注基于YOLO目标检测任务相关将一张labelImg图片标注的xml标签文件检测框复制到其他图片目标检测任务的VOC标签&#xff0c;可复制xml修改目标检测的xml标签(VOC)类别名目标检测任务的VOC标签&#xff0c;修改标签文件的类别名称(nam…

网上打印资料A4纸一般多少钱一张

我们知道&#xff0c;在打印需求上A4纸&#xff08;210mmx297mm&#xff09;是较为常见的打印用纸&#xff0c;同时因为纸张的不同在价格上也存在一定的差异。当然&#xff0c;因在网上打印平台打印资料&#xff0c;能够降低一定的租金个人工成本。 因此&#xff0c;在网上打印…

Swift 中的Getter 和 Setter

目录 前言 1. 什么是Getter和Setter 1.定义 2.作用 2.属性 1.存储属性 2.计算属性 3.属性观察者 3. 使用 Getter 和 Setter 的场景 1.数据转换 2.懒加载 3.数据验证和限制 4.触发相关操作 4.自定义Getter 和 Setter 5. 参考资料 前言 属性是 Swift 编程中的基本…

关于 Spring 是什么

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽庞⼤的社区&#xff0c;这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景&#xff0c;它可以让 Java 企业级的…

九章云极DataCanvas公司DingoDB完成中国信通院权威多模数据库测试

2024年5月16日&#xff0c;九章云极DataCanvas公司自主研发和设计的开源多模向量数据库DingoDB顺利完成中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;多模数据库产品测试。本次测试的成功标志着DingoDB在技术能力、性能表现和产品稳定性方面得到了权威机构的高…

python深入探索斐波那契数列:代码示例与不满足的外围条件

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、斐波那契数列的初步实现 二、外围条件的不满足情况 总结 一、斐波那契数列的初步实现 …

Presto 从提交SQL到获取结果 源码详解(2)

逻辑执行计划&#xff1a; //进入逻辑执行计划阶段 doAnalyzeQuery().new LogicalPlanner().plan(analysis);//createAnalyzePlan createAnalyzePlan(analysis, (Analyze) statement);//返回RelationPlan&#xff0c;&#xff08;返回root根节点&#xff0c;逻辑树上包含输出字…

docker容器中解决中文乱码

1. 找到dockerfile文件 2. 编辑Dockerfile 添加 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 3. 生成新的镜像文件 FROM java17_yinpeng:latest MAINTAINER YP <2064676101QQ.COM> ADD jiquan_online_chat.jar jiquan_online_chat #CM…

Socks5代理IP有什么特点:

小熊IPSocks5代理IP比其他类型的代理具有更多的灵活性和安全性。SOCKS5代理的另一个优点是您可以将其用于任何类型的流量&#xff08;TCP或UDP&#xff09;。您可以有选择地隐藏流量的特定部分&#xff08;基于应用程序&#xff09;&#xff0c;从基于TCP的连接&#xff08;如H…

【HarmonyOS】取消页面转场动画

【HarmonyOS】取消页面转场动画 问题背景&#xff1a; 当A页面切换至B页面时&#xff0c;系统会自带左右进场退场的动画效果。一般来说&#xff0c;该效果是ok的&#xff0c;但是在特殊场景下&#xff0c;例如&#xff1a; A页面跳到B页面&#xff0c;又跳到C页面。C页面直接返…

存储型XSS

前言 什么是存储型xss&#xff1a; 提交恶意xss数据&#xff0c;存入数据库中&#xff0c;访问时触发。 存储型xss和反射型xss区别&#xff1a; 存储型存入数据库中&#xff0c;可持续时间长&#xff0c;而反射型持续时间短&#xff0c;仅对本次访问有影响&#xff0c;反射型一…

中华活页文选高中版投稿发表

《中华活页文选&#xff08;高中版&#xff09;》创刊于1960年&#xff0c;是中宣部所属中国出版传媒股份有限公司主管、中华书局主办的国家级基础教育期刊&#xff0c;曾获得“中国期刊方阵双效期刊”、国家新闻出版广电总局推荐的“百种优秀报刊”等荣誉称号。本刊以高中学科…

TCP连接优化

TCP连接未释放 断开连接后TCP有两个状态&#xff1a; 一个是TIME_WAIT&#xff0c;一个是CLOSE_WAIT&#xff0c;是不同的两个状态 TIME_WAIT&#xff1a;出现在主动断开方&#xff0c;发出最后一个ACK后 CLOSE_WAIT&#xff1a;出现在被动断开方&#xff0c;收到主动断开方的…

Day 6:2981. 找出出现至少三次的最长特殊子字符串 I

Leetcode 2981. 找出出现至少三次的最长特殊子字符串 I 给你一个仅由小写英文字母组成的字符串 s 。 如果一个字符串仅由单一字符组成&#xff0c;那么它被称为 特殊 字符串。例如&#xff0c;字符串 “abc” 不是特殊字符串&#xff0c;而字符串 “ddd”、“zz” 和 “f” 是特…

数据容器:set(集合) 更新啦!

数据容器&#xff1a;set&#xff08;集合&#xff09; 1.集合的定义方式 {元素, 元素, 元素} # 定义集合 my_set {"欣欣向荣", "嘉嘉", "red", "欣欣向荣", "嘉嘉", "red", "欣欣向荣", "嘉嘉…

Spring BeanPostProcessor的前置魔法:揭秘与启迪

1. 引言 Spring框架的BeanPostProcessor是一个强大的扩展点&#xff0c;允许开发者在Spring IoC容器实例化、配置和初始化bean前后插入自定义逻辑。其中&#xff0c;前置方法postProcessBeforeInitialization是BeanPostProcessor接口中的一个重要方法&#xff0c;它在bean的初…

数据库中的视图:定义、作用及使用场景

在数据库的世界中&#xff0c;视图&#xff08;View&#xff09;是一个虚拟的表&#xff0c;其内容由查询定义。视图同真实的表一样&#xff0c;包含一系列带有名称的列和行数据。但是&#xff0c;视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询…