3.1设计模式——Chain of Responsibility 责任链模式(行为型)

意图

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

实现

其中

  • Handle定义一个处理请求的接口:(可选)实现后继续。
  • ConcreteHandle处理它所负担的请求;可访问它的后继者;如果有可处理请求,就处理它,否则将该请求转发给后继者。
  • Client向链上的具体处理处理者(ConcreteHandler)对象提交请求。

适用性

Chain of Responsibility模式适用于一下模式:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 想在太明确指定接收者的情况下向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

代码示例

场景:

假设开发一个邮件处理系统,该系统需要根据邮件的主题和内容进行不同的处理,例如:

  • 如果邮件主题包含 "紧急",则立即发送给相关负责人。
  • 如果邮件内容包含 "投诉",则转发给客服部门处理。
  • 如果邮件内容包含 "广告",则自动标记为垃圾邮件。
  • 如果以上条件都不满足,则将邮件归档。

实现:

可以使用责任链模式来设计这个系统。该模式的核心思想是将多个处理对象链接成一条链,当一个请求到来时,它会沿着链条传递,直到找到合适的处理对象为止。

// 抽象处理者
abstract class Handler {protected Handler nextHandler;public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(Email email);
}// 具体处理者1:紧急邮件处理者
class UrgentHandler extends Handler {@Overridepublic void handleRequest(Email email) {if (email.getSubject().contains("紧急")) {System.out.println("紧急邮件处理者处理邮件:" + email.getSubject());} else {nextHandler.handleRequest(email);}}
}// 具体处理者2:投诉邮件处理者
class ComplaintHandler extends Handler {@Overridepublic void handleRequest(Email email) {if (email.getContent().contains("投诉")) {System.out.println("投诉邮件处理者处理邮件:" + email.getSubject());} else {nextHandler.handleRequest(email);}}
}// 具体处理者3:广告邮件处理者
class SpamHandler extends Handler {@Overridepublic void handleRequest(Email email) {if (email.getContent().contains("广告")) {System.out.println("广告邮件处理者处理邮件:" + email.getSubject());} else {nextHandler.handleRequest(email);}}
}// 具体处理者4:默认邮件处理者
class DefaultHandler extends Handler {@Overridepublic void handleRequest(Email email) {System.out.println("默认邮件处理者处理邮件:" + email.getSubject());}
}// 邮件类
class Email {private String subject;private String content;public Email(String subject, String content) {this.subject = subject;this.content = content;}public String getSubject() {return subject;}public String getContent() {return content;}
}// 测试类
public class Main {public static void main(String[] args) {// 创建处理者链Handler urgentHandler = new UrgentHandler();Handler complaintHandler = new ComplaintHandler();Handler spamHandler = new SpamHandler();Handler defaultHandler = new DefaultHandler();urgentHandler.setNextHandler(complaintHandler);complaintHandler.setNextHandler(spamHandler);spamHandler.setNextHandler(defaultHandler);// 创建邮件Email email1 = new Email("紧急:系统故障", "系统出现故障,请尽快处理");Email email2 = new Email("投诉:产品质量问题", "产品质量存在问题,要求退货");Email email3 = new Email("广告:免费送手机", "免费送手机,数量有限,快来抢购");Email email4 = new Email("普通邮件", "这是一封普通邮件");// 处理邮件urgentHandler.handleRequest(email1);urgentHandler.handleRequest(email2);urgentHandler.handleRequest(email3);urgentHandler.handleRequest(email4);}
}

代码设计注释:

  • Handler 抽象类定义了处理请求的接口,并提供了一个 setNextHandler 方法用于链接处理者。
  • 每个具体的处理者类都继承自 Handler 抽象类,并重写 handleRequest 方法来实现自己的处理逻辑。
  • Email 类代表邮件对象,包含邮件的主题和内容。
  • Main 类中创建了处理者链,并创建了不同的邮件对象,然后调用 handleRequest 方法来处理这些邮件。

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

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

相关文章

【Linux】如何进行用户之间的切换——指令su

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

上网行为管理软件有哪些(5大好用的上网行为监控软件盘点)

企业对于员工工作效率和网络安全的关注度不断提升,上网行为管理软件成为了许多企业的必备工具。这些软件能够实时监控员工的网络活动,帮助企业提高生产力、防止数据泄露,并维护良好的网络环境。 本文将介绍五款大受欢迎的上网行为监控软件&am…

LabVIEW轴承表面缺陷检测系统

LabVIEW轴承表面缺陷检测系统 为了解决轴承生产中人工检测效率低下、误检率高的问题,实现了一套基于LabVIEW的轴承表面缺陷自动检测系统。该系统利用工业相机采集轴承图像,通过图像处理技术对轴承表面的划痕缺陷和倒角缺陷进行自动识别和分析&#xff0…

【详细实现】v1.0 随机点名应用

1.引言 前面对这个应用的功能做了详细的分析(长什么样、能干什么),以先这样对一个项目最开始的分析成为需求分析,需求分析之后就是设计阶段。 那么一般的项目,在设计阶段都需要干什么呢?在需求分析阶段确定…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时,这两个资源都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制&…

惯性测量单元(IMU)CAN接口:M-G552PJ7

M-G552PJ7是一种小形状因子惯性测量单元(IMU),具有6个自由度:三轴角率和线性加速度,利用高精度补偿技术提供高稳定性和 高精度的测量能力。 各种校准参数存储在IMU的内存中,并在IMU的电源被打开后自动反映在…

python项目练习-1

获取无忧书城的小说内容! import requests # 导入请求包 from lxml import etree # 导入处理xml数据包url https://www.51shucheng.net/wangluo/douluodalu/21750.html book_num 1 # 文章页数 download_urls [] # 定义一个空列表,表示我们下载过小…

如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

关于bof-launcher bof-launcher是一款针对Beacon对象文件(BOF)的安全测试工具,在该工具的帮助下,广大研究人员可以轻松在C/C/Zig应用程序中执行Beacon对象文件(BOF)。 Cobalt Strike 4.1于2020年6月25日发…

Checkpoint机制和生产配置

1.前提 在将Checkpoint之前,先回顾一下flink处理数据的流程: 2. 概述 Checkpoint机制,又叫容错机制,可以保证流式任务中,不会因为异常时等原因,造成任务异常退出。可以保证任务正常运行。 (1&…

全志ARM-修改开发板内核启动日志

修改开发板内核日志输出级别: 默认输出级别为1,需要用超级用户权限修改 sudo vi /boot/orangepiEvn.txt 把第一行内核启动输出权限改为7,第二行把输出方式该为“serial”串口输出

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义:二进制流是一种计算机文件格式,它的数据以二进制形式存储,与文本文件不同。 二进制文件可以包含任意类型的数据,例如:图像、音频、视频…

c++输入年月日,计算是该年的第几天

直接把每个月的天数存到数组直接相加会很方便&#xff0c;不用过多的判断。 注意&#xff1a;润年判断方法&#xff08;可以被4整除但不能被100整除&#xff0c;或者可以被400整除&#xff09; #include <iostream> using namespace std;int main() {int year,month,da…

PyCharm 中的特殊标记

在使用 PyCharm 开发 Python 项目的时候&#xff0c;经常会有一些特殊的标记&#xff0c;有些是 IDE 提示的代码规范&#xff0c;有些则为了方便查找而自定义的标记。 我在之前写过一些关于异常捕获的文章&#xff1a;Python3 PyCharm 捕获异常报 Too broad exception clause …

2024年Java JDK下载安装教程,附详细图文

文章目录 简介一、JDK的下载二、JDK的安装三、设置环境变量(不一定需要执行&#xff09; 简介 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f34…

Golang操作Redis

一. Redis介绍 1.1 简介 Redis是完全开源免费的&#xff0c;遵循BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis与其它的key-value缓存产品有以下三个特点&#xff1a; Redis支持数据持久化&#xff0c;可以见内存中的数据报错在磁盘中&#xff0c;重启的时候可以…

助力实现更可持续未来的智能解决方案:AI如何改变世界

人工智能已然成为今年的热门话题。由于生成式AI应用的快速采用&#xff0c;新闻头条充斥着有关AI如何彻底改变我们的政策制定、就业和经济走向的预测。您知道AI也是我们应对各种可持续发展挑战的先锋吗&#xff1f;AI通过分析大量数据&#xff0c;并提供有用的见解和工具&#…

【Unity动画系统】Animator组件的属性

介绍Animator组件的全部属性 Controller&#xff1a;动画控制器 Avatar&#xff1a;人物骨骼 Apply Root Motion&#xff1a;有一些动画片段自带位移&#xff0c;如果希望自带的位移应用在游戏对象上&#xff0c;那么就勾选&#xff1b;如果自己编写脚本&#xff0c;那么就不…

【静态分析】静态分析笔记08 - 指针分析 - 上下文敏感

参考&#xff1a; 【课程笔记】南大软件分析课程8——指针分析-上下文敏感&#xff08;课时11/12&#xff09; - 简书 ------------------------------------------------------------------------------------------------------------- 1. 上下文不敏感的问题 说明&#…

C# 图像处理 添加水印

方法1&#xff0c;使用自带的画刷进行绘制水印 示例代码 public partial class Form1 : Form{public Form1(){InitializeComponent();}string photoPathstring.Empty;Bitmap image null;private void button1_Click(object sender, EventArgs e) //选择照片{OpenFileDialog d…

【C++】位图

文章目录 1. 位图概念2. 位图的实现3. 位图的应用 1. 位图概念 面试题 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40 亿个数中。 遍历&#xff0c;时间复杂度 O(N) 排序 O(NlogN)&#xff0c;利用二分查找&…