设计模式- 责任链模式(行为型)

责任链模式

责任链模式是一种行为模式,它为请求创建一个接收者对象的链,解耦了请求的发送者和接收者。责任链模式将多个处理器串联起来形成一条处理请求的链。

图解

请添加图片描述

角色

  1. 抽象处理者: 一个处理请求的接口,可以通过设置返回值的方法判断处理的方式,以及是否继续处理
  2. 具体处理者:实现抽象处理的接口
  3. 客户端: 创建处理者的对象,并将他们连接成链,它只负责将请求发送给第一个处理者,不需要关注请求处理的过程

代码实现

其实责任链的实现方式有很多,比如定义一个xxxChain,将所有的处理器都放到此类中,在此类中将多个处理器连接起来,另外此类也可以实现抽象处理接口以便于链和链之间也可以组装;
另一种方式,抽象处理者接口定义设置下一个处理器的接口,将处理结果传递给下一个处理器。此处案例使用第一种方法,根据不同条件过滤一个数组;

抽象处理者

public interface Filter {FilterVo filter(FilterVo filterVo);
}

定义一个类接收处理器返回的结果

public class FilterVo {private int[] arr;//处理后的数组private boolean flag;//如果数组长度为0,不必继续执行,用来标记是否继续处理
}

具体处理者

/** 过滤偶数*/
public class EvenFilter implements Filter{@Overridepublic FilterVo filter(FilterVo filterVo) {int[] arr = filterVo.getArr();arr = Arrays.stream(arr).filter(item -> item%2 ==0).toArray();return new FilterVo(arr,arr.length > 0);}
}
/** 正数过滤*/
public class PositiveNumbersFilter implements Filter {@Overridepublic FilterVo filter(FilterVo filterVo) {int[] arr = filterVo.getArr();arr = Arrays.stream(arr).filter(item -> item > 0).toArray();return new FilterVo(arr, arr.length > 0);}
}/** 大于20的数过滤*/
public class SpecialFilter implements Filter{@Overridepublic FilterVo filter(FilterVo filterVo) {int[] arr = filterVo.getArr();arr = Arrays.stream(arr).filter(item -> item > 20).toArray();return new FilterVo(arr,arr.length > 0);}
}

客户端:定义两个客户端也实现filter接口,方便链条和链条之间的组装

public class PositiveNumbersFilter implements Filter {@Overridepublic FilterVo filter(FilterVo filterVo) {int[] arr = filterVo.getArr();arr = Arrays.stream(arr).filter(item -> item > 0).toArray();return new FilterVo(arr, arr.length > 0);}
}
public class SpecialChainFilter implements Filter{private List<Filter> filterList = new LinkedList();@Overridepublic FilterVo filter(FilterVo filterVo) {FilterVo newFilterVo = filterVo;for (int i = 0; i < filterList.size(); i++) {FilterVo tempFilterVo = filterList.get(i).filter(newFilterVo);if (!tempFilterVo.isFlag()) {break;} else {newFilterVo.setArr(tempFilterVo.getArr());newFilterVo.setFlag(tempFilterVo.getArr().length > 0);}}return newFilterVo;}public void add(Filter filter){filterList.add(filter);}
}

使用

public class Test {public static void main(String[] args) {int [] arr = new int[]{-1,1,2,3,4,-2,13,22};FilterVo filterVo = new FilterVo(arr, arr.length > 0);ChainFilter chainFilter = new ChainFilter();chainFilter.add(new PositiveNumbersFilter());chainFilter.add(new EvenFilter());SpecialChainFilter specialChainFilter = new SpecialChainFilter();specialChainFilter.add(new SpecialFilter());chainFilter.add(specialChainFilter);int[] filterArr =chainFilter.filter(filterVo).getArr();for (int i = 0; i < filterArr.length; i++) {System.out.println(filterArr[i]);}}
}

总结

责任链模式的使用有拦截器、过滤器等使用场景,如果在业务种使用不确定数量类处理,可以考虑责任链模式

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

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

相关文章

codesys【CAN总线】

1下载设备描述文件&#xff1a; 必须下载设备描述文件&#xff0c;要不然编程软件无法正确组态。 根据实际设备【品牌】去官网搜索下载。 以 DMA882-CAN 为例 CAN的设备描述文件是【.eds】的扩展名 安装设备描述文件。 2添加CAN总线&#xff1a; 1添加【CAN总线】&#xff1a…

同盾中文点选验证码识别方法

中文验证码一直是识别的难题&#xff0c;首先他分类的种类很多&#xff0c;常见中文都有3500个&#xff0c;而且一般中文验证码都会有变形&#xff0c;导致每一个文字都需要大量训练样本。假设每一个汉字样本需要100个&#xff0c;100350035万个样本&#xff0c;所以标记的样本…

excel拖拽怎么使单元格序号不递增

拖拽下来不仅不递增&#xff0c;而且右下角没有倒三角可以设置改变&#xff0c;&#xff08;即没有下图这个&#xff09; 则&#xff0c;可以采用以下方法 excel数值拖拽不递增还有一个更快更快捷的方法&#xff0c;这就运用到了excel快捷键&#xff0c;我们把鼠标放到单元格的…

C/C++|Pimpl Idiom(Pointer to IMPLementation) 指针实现模式浅析

Pimpl Idiom&#xff08;Pointer to IMPLementation&#xff09;&#xff0c;也称为 “Opaque Pointer”&#xff08;不透明指针&#xff09;或 “Cheshire Cat”&#xff08;柴郡猫&#xff09;模式或者"指针实现模式"和"实现隐藏模式"。这种模式通过将类…

模板字符串

模板字符串&#xff08;Template Literals&#xff09;是在ES6&#xff08;ECMAScript 2015&#xff09;中引入的一种新的字符串表示法&#xff0c;它提供了构建字符串的更加强大和灵活的方式。模板字符串可以通过反引号&#xff08;&#xff09;&#xff08;而不是普通的单引号…

04-4.2.4 KMP 算法的进一步优化

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

IP分片的隐患,以及TCP分片

好的&#xff0c;我们来用一个生活中的例子更详细地解释 MTU、MSS&#xff0c;以及 IP 和 TCP 分片。 MTU 和 MSS 的概念 MTU&#xff08;Maximum Transmission Unit&#xff0c;最大传输单元&#xff09;&#xff1a; 假设你搬家&#xff0c;需要用卡车搬运家具。 卡车的最…

什么是动态联编、静态联编?

动态联编&#xff08;Dynamic Binding&#xff09;和静态联编&#xff08;Static Binding&#xff09;是面向对象编程中的两个重要概念&#xff0c;它们描述了程序在运行时如何确定调用哪个方法或属性。 静态联编&#xff08;Static Binding&#xff09; 静态联编&#xff0c…

Hadoop 2.0:主流开源云架构(一)

目录 一、引例&#xff08;一&#xff09;问题概述&#xff08;二&#xff09;常规解决方案&#xff08;三&#xff09;分布式下的解决方案&#xff08;四&#xff09;小结 自从云计算的概念被提出&#xff0c;不断地有IT厂商推出自己的云计算平台&#xff0c;但它们都是商业性…

Suno小技巧大揭秘,不会这些技巧别说你懂AI音乐

Suno是一个强大的AI音乐生成工具&#xff0c;它不仅可以帮你快速生成音乐&#xff0c;还能精确地根据你的需求进行调整。无论你是音乐小白还是专业音乐人&#xff0c;这篇文章将揭示一些鲜为人知的Suno技巧&#xff0c;帮助你最大化利用这个工具的潜力。 技巧一&#xff1a;精准…

解读下/etc/network/interfaces配置文件

/etc/network/interfaces 是一个常见的网络配置文件&#xff0c;通常在 Debian 及其衍生版本的 Linux 发行版中使用。该文件用于配置网络接口和网络连接参数&#xff0c;允许用户手动设置网络连接的属性&#xff0c;包括 IP 地址、子网掩码、网关、DNS 服务器等。 以下是一个可…

时间相关格式的转化

时间转秒越界 时间不加 L 就会越界 long l 90L * 24 * 60 * 60 * 1000;System.out.println(l);固定时间格式化 Date curTime new Date();SimpleDateFormat simpleDateFormat new SimpleDateFormat("HH:mm");// 19:30System.out.println(simpleDateFormat.format(…

POJ 2887:Big String ← 块状链表

【题目来源】http://poj.org/problem?id2887【题目描述】 You are given a string and supposed to do some string manipulations.【输入格式】 The first line of the input contains the initial string. You can assume that it is non-empty and its length does not exc…

基于JSP的班级同学录网站

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 个人中心 同学录管…

Qt for android :解决requestperssion后无法马上访问设备的问题

描述 当需要访问到设备硬件时&#xff0c; 涉及到Android权限&#xff0c;所以需要进行权限申请&#xff0c; 申请完之后访问常常发现权限不足&#xff0c; 为什么呢&#xff1f; 1. 从Qt库角度看问题&#xff1a; 无论是 QCoreApplication::requestPermission [since 6.5] te…

确保数据一致性的技术

禁止其他人同时使用数据 互联网提供的服务是可以供大量用户同时访问的。此时&#xff0c;就要求即使多人同时引用同一数据&#xff0c;或者同时更新数据&#xff0c;也不会产生冲突并且可以顺利执行处理。这种处理方式被称为并发控制。 但是&#xff0c;如果多人同时操作同一数…

51单片机独立按键控制LED灯,按键按一次亮,再按一次灭

1、功能描述 独立按键控制LED灯&#xff0c;按键按一次亮&#xff0c;再按一次灭 2、实验原理 轻触按键:相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动米实现接通和断开&#xff1b;…

网络网络层之(6)ICMPv6协议

网络网络层之(6)ICMPv6协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

WPF-UI布局

WPF布局元素有如下几个&#xff1a; Grid&#xff1a;网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel&#xff1a;栈式面板。可将包含的元素在竖直或水平方向上排成一条直线&#xff0c;当移除一个元素后&#xff0c;后面的元素会自动向前移…

怎么使用useLayoutEffect

useLayoutEffect 是 React 中的一个 Hook,与 useEffect 类似,但它在浏览器绘制任何内容之前同步触发。这意味着,如果你需要在 DOM 更新后执行某些操作,并且这些操作可能会影响到组件的布局或渲染,那么使用 useLayoutEffect 会更合适。 以下是如何使用 useLayoutEffect 的…