责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。
网上有很多朋友已经对该模式介绍的非常详细了,也有案例帮助理解,可参考
一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式
但是这两篇文章的案例中,对象与对象之间是有先后顺序的,即请求需要先发给组长,再发给经理,不能调换顺序,但是生活中和我们实际开发过程中,对象与对象之间也可以是平行关系,就像产品在流水线上做检查一样,先检查哪一部分都可以,任何一部分有问题,即可返回,不再往后检查。
本篇文章就是在上面两篇文章上做了改进,改成对象与对象之间是相互独立的并列关系。相比于第一篇文章,增加了处理器对象可动态配置功能。相比于第二篇文章,例子通俗易懂,请求简单化(有些场景不需要对请求进一步封装)。
该场景描述的是一个待检产品在流水线上检查,产品有两个属性,长度和宽度,流水线上的处理节点也有两个,即长度检查节点和宽度检查节点。为帮助理解,该场景设置的较为简单,实际开发工作中,待检查对象(请求)可以为上下文对象,附带较多属性,同时检查处理节点也可有多个,它们之间是相互独立的。
产品定义
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor; /** * 待检验产品 */@AllArgsConstructor@NoArgsConstructor@Datapublic class Product { /** * 产品长度 */ Integer length; /** * 产品宽度 */ Integer width;}
处理器执行链定义,责任链的核心在于此
import java.util.ArrayList;import java.util.List; public class ProcessorChain{ // 保存处理节点 private List<Processor> processorList = new ArrayList<>(); // 处理节点下标 private int index = 0; // 动态扩展处理节点 public ProcessorChain addProcessor(Processor processor) { processorList.add(processor); return this; } // 获取处理器处理 public boolean process(Product product, ProcessorChain chain) { if(index == processorList.size()) { return true; } Processor processor = processorList.get(index); index++; return processor.process(product, chain); } }
处理器接口定义
public interface Processor { boolean process(Product request, ProcessorChain chain);}
长度检查处理器和宽度检查处理器
public class LengthCheckProcessor implements Processor{ @Override public boolean process(Product request, ProcessorChain chain) { Integer length = request.getLength(); if (length < 100 && length > 50) { System.out.println("产品长度检验通过"); return chain.process(request, chain); } // 产品长度未检验通过 System.out.println("产品长度未检验通过"); return false; }}
public class WidthCheckProcessor implements Processor{ @Override public boolean process(Product request, ProcessorChain chain) { Integer width = request.getWidth(); if (width < 100 && width > 50) { System.out.println("产品宽度检验通过"); return chain.process(request, chain); } // 产品宽度未检验通过 System.out.println("产品宽度未检验通过"); return false; }}
客户端
public class Main { public static void main(String[] args) { int[][] arrays = {{60, 60}, {40, 40}, {40, 60}, {60, 40}}; for (int[] array : arrays) { ProcessorChain processorChain = new ProcessorChain(); processorChain.addProcessor(new LengthCheckProcessor()); processorChain.addProcessor(new WidthCheckProcessor()); Product product = new Product(array[0], array[1]); boolean checkResult = processorChain.process(product, processorChain); if(checkResult) { System.out.println("产品最终检验合格"); } else { System.out.println("产品最终检验不合格"); } System.out.println(); } }}
结果:
产品长度检验通过产品宽度检验通过产品最终检验合格 产品长度未检验通过产品最终检验不合格 产品长度未检验通过产品最终检验不合格 产品长度检验通过产品宽度未检验通过产品最终检验不合格
1. 每个处理器可以通过注解扫描的方式添加进执行链中,不必在客户端中人为添加,只需自己定义处理器,实现处理器接口,添加该处理器的执行逻辑。
2. 待处理的请求对象可以是上下文对象,上下文对象中封装待检查条件,并将检查结果写入到上下文对象中。
如有问题,欢迎指正。也可加QQ 2422035338沟通交流。
1. https://segmentfault.com/a/1190000014940291
2. 一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式
原网址: 访问
创建于: 2022-07-05 09:57:57
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论