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

设计模式之责任链模式

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

责任链模式适合于请求需要经过多个处理器,并被其中一个或多个处理器执行。

«interface»
Handler
+setNext(Handler)
+handler(Request)
ConcreteHandler
next:Handler
+setNext(Handler)
+handler(Request)

代码实现:

// 抽象处理器  
public abstract class Handler {  private Handler next;  // 初始化处理链  public static Handler init(Handler... handlers) {  Handler first = handlers[0];  for (int i = 1; i < handlers.length; i++) {  first.setNext(handlers[i]);  first = handlers[i];  }  return handlers[0];  }  public void setNext(Handler handler) {  next = handler;  }  // 处理当前请求  public abstract void handle(Request request);  //处理下一个请求  protected void nextHandle(Request request) {  if (next != null) {  next.handle(request);  }  }  
}
public class HandlerA extends Handler {  @Override  public void handle(Request request) {  request.addName("HandlerA");  nextHandle(request);  }  
}public class HandlerB extends Handler {  @Override  public void handle(Request request) {  request.addName("HandlerB");  nextHandle(request);  }  
}
// 请求
@Data  
public class Request {  private final List<String> names = new ArrayList<>();  public void addName(String name) {  names.add(name);  }  
}
public static void main(String[] args) {  Handler handler = Handler.init(new HandlerA(), new HandlerB());  Request request = new Request();  handler.handle(request);  System.out.println(request.getNames());  
}  

上面的例子跟链表相像,一个处理器保持有下一个处理器的引用。

另一种实现变体是处理器的引用统一由处理器链管理,处理器链决定处理的顺序。

public interface Handler {  void handle(Request request,HandlerChain chain);  
}
public class HandlerA implements Handler{  @Override  public void handle(Request request, HandlerChain chain) {  request.addName("HandlerA");  chain.handle(request);  }  
}public class HandlerB implements Handler{  @Override  public void handle(Request request, HandlerChain chain) {  request.addName("HandlerB");  chain.handle(request);  }  
}
public class HandlerChain {  private List<Handler> handlers = new ArrayList<>();  // 当前指针  int cur=0;  public void addHandler(Handler handler) {  handlers.add(handler);  }  public void handle(Request request){  if(cur>=handlers.size()){  return;  }  Handler handler = handlers.get(cur++);  handler.handle(request, this);  }  
}
public static void main(String[] args) {  HandlerChain chain=new HandlerChain();  chain.addHandler(new HandlerA());  chain.addHandler(new HandlerB());  Request request=new Request();  chain.handle(request);  System.out.println(request.getNames());  
}

责任链变化的地方是处理的流程。

优点是:

  1. 处理的顺序可以随时修改
  2. 方便新增或删除处理者

相关文章:

设计模式之责任链模式

责任链模式的定义是&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有对象处理它为止。 责任链模式适合于请求需要经过多个处理器&#xff0c;并…...

Python--我一般都用这个模块压缩文件

打包成压缩文件很多时候都能用上&#xff0c;也包括了自动化中的部分应用。例如&#xff0c;将测试报告打包发送。 本章就来介绍其中一个模块&#xff0c;可以用于结合上一章的内容结合使用。 from zipfile import ZipFile ❝ ZipFile是zipfile的一个方法。 ❞ 提取zip文件 fro…...

Chapter8 :Physical Constraints(ug903)

8.1About Physical Constraints&#xff08;关于物理约束&#xff09; XilinxVivado集成设计环境&#xff08;IDE&#xff09;允许通过设置对象属性值对设计对象进行物理约束。示例包括&#xff1a; •I/O约束&#xff0c;如位置和I/O标准 •布局约束&…...

星标3.5k,一款国产的轻量级开源在线项目任务管理工具

今天给大家推荐一个轻量级的开源在线项目任务管理工具&#xff1a;DooTask 图片 DooTask 提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM&#xff0c;文件管理等工具。 高效便捷的团队沟通工具 针对项目和任务建立群组&#xff0c;工作问题可…...

【华为OD机试真题2023B卷 JAVA】字符串摘要

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 字符串摘要 知识点字符串排序 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定一个字符串的摘要算法,请输出给定字符串的摘要值。 1、去除字符串中非字母的符号。 2、如果出现连续字符(不区分大小写),则输…...

Java线程概述 (一)线程介绍

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1fa85;什么是程序 、进程、线程&#xff1f;&#x1fa85;线程的生命周期&#x1fa85;多线程&#x1fa85;守护者线程&#x1fa85;线程并行与并发&#x1fa85;死锁&#x1f…...

操作系统第三章——存储系统(下)

锦衣雪华玉颜色&#xff0c;回眸一笑天下倾 文章目录 3.2.1 虚拟内存的基本概念知识总览传统存储方式的特征&#xff0c;缺点局部性原理虚拟内存的定义如何实现虚拟内存技术知识总结 3.2.2 请求分页管理方式知识总览页表机制缺页中断机制地址变换机制知识回顾 3.2.3 页面置换算…...

初识结构体

目录 结构体的声明 结构体的基础知识 结构体的声明 结构体成员的类型 结构体变量的定义和初始化 定义 初始化 结构体成员的访问 结构体变量访问成员 结构体指针访问指向变量的成员 结构体传参 传地址 传结构体 结论 结构体的声明 结构体的基础知识 数组&#xff…...

协程并发下数据汇总:除了互斥锁,还有其他方式吗?

1. 简介 本文介绍了在并发编程中数据汇总的问题&#xff0c;并探讨了在并发环境下使用互斥锁和通道两种方式来保证数据安全性的方法。 首先&#xff0c;通过一个实例&#xff0c;描述了一个并发拉取数据并汇总的案例&#xff0c;并使用互斥锁来确保线程安全。然后&#xff0c…...

5、Ray-Actor模型和并发编程

5、Ray-Actor模型和并发编程 导航 1.简介和背景 2.Ray的基本概念和核心组件 3.分布式任务调度和依赖管理 4.对象存储和数据共享 5.Actor模型和并发编程 6.Ray的高级功能和扩展性 7.使用Ray构建分布式应用程序的案例研究 8.Ray社区和资源 9.核心框架介绍...

HNU-电路与电子学-小班2

第二次讨论 讨论题目&#xff1a; 1、电子秤的电桥电路可以分别用 1 个压控电阻、 2 个压控电阻、 3 个压控电阻、 4 个压控电阻实现吗&#xff1f;试写出每种实现的 U AB 输出表达式&#xff0c;并分析哪种实现电桥 电压的灵敏度&#xff08;SV/ △ R &#xff09;高。 …...

二分图匹配算法

匈牙利算法、Hopcroft-Karp算法和Kuhn-Munkres算法是三种常见的二分图匹配算法&#xff0c;它们在实现方式、时间复杂度和适用场景上有所差异。以下是它们的区别和优缺点&#xff1a; 匈牙利算法&#xff1a; 实现方式&#xff1a;匈牙利算法使用深度优先搜索(DFS)来寻找增广路…...

虹科技术 | 虹科EtherCAT增量编码器输入模块数据采集实操测试

1. 背景介绍 编码器是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号&#xff0c;前者称为码盘&#xff0c;后者称为码尺。按照读出方式编码器可以分为接触式和非接触式两种&#xff1b;按照工作原理编码器可分为…...

2023.05.21 学习周报

文章目录 摘要文献阅读1.题目2.背景3.现存问题和解决方法4.方法4.1 Variational mode decomposition (VMD)4.2 Bidirectional LSTM 5.实验5.1 数据标准化5.2 评价指标5.3 实验过程及结果 6.结论和展望 优劣解距离法有限元1.求解一个简单的传热问题2.有限元如何实现 总结 摘要 …...

资深程序员深度体验ChatGPT一周发现竟然....

周一打卡上班&#xff0c;老板凑到我跟前&#xff1a;“小李啊&#xff0c;这周有个新需求交给你做一下&#xff0c;给我们的API管理平台新增一个智能Mock的功能...”。我条件反射般的差点脱口而出&#xff1a;“这个需求做不了..”。不过在千钧一发之间&#xff0c;我想起了最…...

带你深入了解Android Handler的用法

Android中&#xff0c;Handler是一类用于异步消息传递和线程之间通信的基础框架。一个Handler是一个线程的处理器&#xff0c;可以接收消息&#xff0c;并调度运行它们。使用Handler&#xff0c;应用程序可以将处理器与一个线程关联&#xff0c;以将来的时间运行任务。而使用Ha…...

生于零售的亚马逊云科技,如何加速中国跨境电商企业出海?

导读&#xff1a;跨境电商进入精耕细作的新阶段。 作为中国企业出海的重要领域之一&#xff0c;近几年跨境电商行业处在快速发展中。商务部数据显示&#xff0c;2022年中国跨境电商出口达1.55万亿&#xff0c;同比增长11.7%。2023年1-2月&#xff0c;跨境电商进出口总额同比增长…...

兄弟组件传值$on无法接收值

方法一 前提是必须引入EventBus&#xff0c;而且该方法一刷新数据就没了 1.组件A里&#xff0c;点击事件里面使用$emit传入数据 2.组件A里&#xff0c;mounted里面使用$on接收数据&#xff0c;并把数据赋给EventBus EventBus.$on(detail,(data) > { EventBus.senddata d…...

Spring事务及事务传播机制

一.事务的含义:多个操作封装在一起&#xff0c;要么同时执行成功&#xff0c;一旦有一个操作执行失败&#xff0c;那么全部执行失败。这里给大家举个例子:比如A给B转账50元&#xff0c;而B没有收到这50元&#xff0c;此时A转账B这个操作也需要进行回滚&#xff0c;恢复到A给B没…...

npm i 常见问题

需要注意的是&#xff0c;如果你在使用 NPM 安装包的过程中遇到了任何问题&#xff0c;可以尝试使用 --verbose 参数打印更详细的错误信息&#xff0c;以便更好地诊断问题。例如&#xff1a; npm install --verbose 1、vue老项目缺少编译环境安装依赖报错的问题 待下载的项目…...

OpenClaw环境迁移指南:将Phi-3-mini-128k-instruct配置复制到新电脑

OpenClaw环境迁移指南&#xff1a;将Phi-3-mini-128k-instruct配置复制到新电脑 1. 为什么需要环境迁移&#xff1f; 上周我的主力开发机突然硬盘故障&#xff0c;虽然数据最终恢复&#xff0c;但重装OpenClaw环境的过程让我意识到&#xff1a;自动化工具的配置迁移应该像备份…...

AD09 PCB设计技巧与实战经验分享

1. PCB设计基础与AD09软件概述作为一名从业十年的硬件工程师&#xff0c;我使用Altium Designer&#xff08;简称AD&#xff09;完成了近百个PCB设计项目&#xff0c;从简单的双面板到复杂的八层板都有涉及。AD09虽然是比较早期的版本&#xff0c;但其核心功能已经非常完善&…...

别再死记硬背了!用“预测-修正”的直觉理解卡尔曼滤波(附自动驾驶传感器例子)

用“预测-修正”的直觉理解卡尔曼滤波&#xff1a;自动驾驶中的传感器融合艺术 想象一下你在雾天开车&#xff0c;挡风玻璃上沾满雨滴&#xff0c;后视镜模糊不清。此时你需要同时依赖速度表读数、前方车辆尾灯的位置记忆、以及隐约可见的路标来判断自己的位置和速度——这本质…...

ParaView实战:5分钟搞定热流图单元格体积计算(附Python脚本)

ParaView热流分析实战&#xff1a;从单元格体积计算到三维可视化全流程指南 在计算流体力学和热传导分析中&#xff0c;准确获取网格单元的体积数据是后续量化分析的基础。许多工程师在处理复杂几何体的热流分布时&#xff0c;常常陷入繁琐的手动计算或复杂的编程工作中。实际上…...

植物大战僵尸革新辅助工具:PVZ Toolkit全方位功能解析与使用指南

植物大战僵尸革新辅助工具&#xff1a;PVZ Toolkit全方位功能解析与使用指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 植物大战僵尸作为经典塔防游戏&#xff0c;多年来一直拥有庞大的玩家群…...

Oh-My-Posh 多会话管理终极指南:在不同终端中保持一致的完美体验

Oh-My-Posh 多会话管理终极指南&#xff1a;在不同终端中保持一致的完美体验 【免费下载链接】oh-my-posh2 A prompt theming engine for Powershell 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-posh2 Oh-My-Posh 是一款强大的 PowerShell 提示符主题引擎&…...

IDMPhotoBrowser:iOS开发者的终极照片浏览器解决方案

IDMPhotoBrowser&#xff1a;iOS开发者的终极照片浏览器解决方案 【免费下载链接】IDMPhotoBrowser Photo Browser / Viewer inspired by Facebooks and Tweetbots with ARC support, swipe-to-dismiss, image progress and more 项目地址: https://gitcode.com/gh_mirrors/i…...

ozz-animation多格式导入工具链详解:FBX、glTF、Collada全支持

ozz-animation多格式导入工具链详解&#xff1a;FBX、glTF、Collada全支持 【免费下载链接】ozz-animation Open source c skeletal animation library and toolset 项目地址: https://gitcode.com/gh_mirrors/oz/ozz-animation ozz-animation是一款开源C骨骼动画库和工…...

为什么一个非常大的数的导数是一个非常小的数?

“数”本身没有导数&#xff0c;因为导数是针对函数的&#xff08;描述函数在某点的变化率或斜率&#xff09;。如果你指的是某个函数在自变量很大时&#xff0c;函数值&#xff08;y&#xff09;变得“非常大”&#xff0c;但其导数&#xff08;y&#xff09;却“非常小”&…...

OpenClaw本地代理方案:千问3.5-35B-A3B-FP8接口调用加速3种方法

OpenClaw本地代理方案&#xff1a;千问3.5-35B-A3B-FP8接口调用加速3种方法 1. 问题背景与挑战 去年夏天&#xff0c;当我第一次尝试用OpenClaw对接千问3.5-35B-A3B-FP8模型处理图文混合任务时&#xff0c;遇到了令人头疼的延迟问题。一个简单的"分析截图中的文字并生成…...