设计模式之《责任链模式》
------《责任链模式》
- 责任链模式的概念
- 为什么用责任链模式
- 工作中用在哪里
- 设计思路
- 代码实现
- 总结
责任链模式的概念
责任链模式是一种行为型设计模式,它允许你将请求沿着处理链传递,直到有一个处理者能够处理该请求为止。
在责任链模式中,每个处理者都有自己的逻辑处理方式,当该处理者无法处理该请求时,它会将请求传递给下一个处理者,直到请求被处理为止。这种模式可以有效地避免项目中出现大量 if else 语句的情况,同时也方便代码的维护。
为什么用责任链模式
使用责任链模式的好处在于,它可以有效地处理复杂的业务场景。在实际项目中,往往存在多种业务逻辑需要进行处理,同时这些业务的处理顺序也可能会有所不同。使用责任链模式可以将这些业务逻辑进行灵活组合,并且能够随时调整处理顺序,提高代码的可维护性和扩展性。
工作中用在哪里
在Android开发中,使用责任链模式的场景比较多。比如,我们在进行网络请求时,可能需要对请求进行拦截和处理,比如判断网络是否可用、是否需要进行重试、是否需要缓存等等。这些处理逻辑可能是有先后顺序的,这时就可以采用责任链模式来组合这些处理逻辑。
设计思路
在设计责任链模式时,需要定义一个抽象处理者的接口,该接口定义了处理请求的方法和设置下一个处理者的方法。然后定义具体的处理者类,它们分别实现抽象处理者接口,并在处理请求时进行逻辑处理。最后将这些处理者组合成一条链,每个处理者都设置它的下一个处理者。
代码实现
我们以Android的网络请求为例,实现一个简单的责任链模式。
首先定义一个抽象的请求处理者接口:
public interface RequestHandler {void handleRequest(Request request, Chain chain);interface Chain {Request request();void proceed(Request request);}
}
上述接口定义了处理请求的方法 handleRequest 和设置下一个处理者的方法 proceed。其中,Chain接口定义了获取请求对象的方法 request(),每个处理者可以通过该方法获取请求的信息,并通过调用 proceed()方法将请求传递给下一个处理者。
然后定义具体的请求处理者:
public class NetworkAvailableHandler implements RequestHandler {@Overridepublic void handleRequest(Request request, Chain chain) {if (isNetworkAvailable()) {chain.proceed(request);} else {// 网络不可用,直接返回错误信息request.setError(new Error("Network is not available"));// 处理完成,回调请求结果onRequestFinished(request);}}private boolean isNetworkAvailable() {// 判断当前网络是否可用return true;}
}public class RetryHandler implements RequestHandler {private static final int MAX_RETRY_COUNT = 3;@Overridepublic void handleRequest(Request request, Chain chain) {int retryCount = 0;while (retryCount < MAX_RETRY_COUNT) {try {chain.proceed(request);break;} catch (IOException e) {retryCount++;}}}
}public class CacheHandler implements RequestHandler {@Overridepublic void handleRequest(Request request, Chain chain) {if (request.isCacheEnabled() && isCached(request.getUrl())) {// 如果缓存可用,直接从缓存中获取数据request.setResult(getCache(request.getUrl()));// 处理完成,回调请求结果onRequestFinished(request);} else {// 如果缓存不可用,继续往下处理chain.proceed(request);}}private boolean isCached(String url) {// 判断当前请求是否已经缓存return false;}private String getCache(String url) {// 从缓存中获取数据return null;}
}
其中,NetworkAvailableHandler 类判断网络是否可用;RetryHandler 类实现了请求的重试逻辑;CacheHandler 类实现了请求的缓存逻辑。
最后将这些处理者对象组成一条处理链:
RequestHandler cacheHandler = new CacheHandler();
RequestHandler retryHandler = new RetryHandler();
RequestHandler networkHandler = new NetworkAvailableHandler();cacheHandler.setNextHandler(retryHandler);
retryHandler.setNextHandler(networkHandler);
其中,setNextHandler() 方法用于设置当前处理者的下一个处理者对象。
最终,将请求对象传入处理链的第一个处理者中,经过一系列处理后,请求的结果将通过 onRequestFinished() 方法进行回调。
总结
责任链模式可以灵活地处理多重业务逻辑,同时也能够随时调整处理顺序,提高代码的可维护性和扩展性。在Android开发中,使用责任链模式可以方便地处理网络请求、事件分发等复杂业务场景。
相关文章:
设计模式之《责任链模式》
------《责任链模式》责任链模式的概念为什么用责任链模式工作中用在哪里设计思路代码实现总结责任链模式的概念 责任链模式是一种行为型设计模式,它允许你将请求沿着处理链传递,直到有一个处理者能够处理该请求为止。 在责任链模式中,每个…...
Android Studio实现多功能日记本
项目目录一、项目概述二、系统特点三、开发环境四、详细设计1、E-R图2、数据库3、系统设置五、运行演示一、项目概述 本次实现了功能实用且齐全的日记本,界面友好,使用便捷,采用MVC架构设计。使用SQLite数据库存储数据,数据表有主…...
只依赖Tensorrt和opencv的yolov5源代码
simple_yolo.hpp #ifndef SIMPLE_YOLO_HPP #define SIMPLE_YOLO_HPP/*简单的yolo接口,容易集成但是高性能 */#include <vector> #include <memory> #include <string> #include <future> #include <opencv2/opencv.hpp>namespace Si…...
多路I/O转接 poll(了解)
poll() 的机制与 select() 类似,与 select() 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll() 没有最大文件描述符数量的限制(但是数量过大后性能也是会下降)。 p…...
听说你也在为配置tomcat server而烦恼,看我这一篇,让你醍醐灌顶!
一.通过maven创建项目 二.下载tomcat服务器 我们一般在tomcat官网中进行tomcat的下载 Apache Tomcat - Welcome! 三.添加配置:我们点击下图中的文件配置 四.测试配置的tomcat 我们在文件的body中输入 测试内容: 在控制台中显式tomcat运行的信息&#…...
【从零开始学Skynet】工具篇(二):虚拟机文件的复制粘贴
大家在Linux系统下开发的时候肯定会遇到虚拟机与主机间无法复制粘贴的问题,现在我们就来解决这样的问题,方便我们的开发。 1、打开设置 我们可以系统界面的菜单栏点击“控制”,然后打开“设置”; 也可以在VirtualBox界面打开“设…...
全球自动驾驶竞争力最新排行榜,4家中国企业上榜
发展至今,自动驾驶技术不仅是汽车行业的一个主战场,更是全球科技领域中备受关注和充满竞争的一个重要领域。近年来,各大汽车制造商和科技公司都在投入大量财力物力人力进行自动驾驶技术的研发,并进一步争夺市场份额。 当然&#…...
APP启动流程分析
1、要分析的问题 1、与正常trace比对,确认过耗时在哪个步骤(am create/pause/stop/start/doframe)? 2、与正常trace比对,确认过耗时在哪个cpu state(Running/Runnable/Sleep/Uninterruptible Sleep)? 2、启动分析 …...
IIR数字滤波器简介与实现
一、简介: IIR是一种数字滤波器,其输出是输入信号和过去输出的某些加权和。IIR滤波器由反馈和前馈组成,可以用于滤除或增强信号的特定频率成分。 IIR滤波器的输出表示为: y[n] b0 * x[n] b1 * x[n-1] b2 * x[n-2] … - a1 * …...
3.5 函数的极值与最大值和最小值
学习目标: 我要学习函数的极值、最大值和最小值,我会采取以下几个步骤: 理解基本概念:首先,我会理解函数的极值、最大值和最小值的概念。例如,我会学习函数在特定区间内的最高点和最低点,并且理…...
第五十八天打卡
第五十八天打卡 739. 每日温度 提示 中等 1.5K company 亚马逊 company Facebook company 字节跳动 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在…...
双一流大学计算机专业月薪拿2000?网友:我裂开
**“计算机不行了”“求求不要再学计算机”……**这样的言论时不时就会在网上掀起一番热议,知了姐看得不少。尤其最近有则新闻,更是给计算机专业盖上“不值钱”的帽子。 某985、211大学校招会上,有企业招聘计算机相关岗位时,提出…...
ChatGPT的“N宗罪”?|AI百态(上篇)
序: AI诞生伊始,那是人人欣喜若狂的科技曙光,深埋于哲学、想象和虚构中的古老的梦,终于成真,一个个肉眼可见的智能机器人,在复刻、模仿和服务着他们的造物主——人类。 但科技树的点亮,总会遇到…...
48.现有移动端开源框架及其特点—MDL(mobile-deep-learning)
48.1 功能特点 一键部署,脚本参数就可以切换ios或者android支持iOS gpu运行MobileNet、squeezenet模型已经测试过可以稳定运行MobileNet、GoogLeNet v1、squeezenet、ResNet-50模型体积极小,无任何第三方依赖。纯手工打造。提供量化函数,对32位float转8位uint直接支持,模型…...
4.9--计算机网络之TCP篇之TCP Keepalive 和 HTTP Keep-Alive --(复习+大总结)---沉淀ing
HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接; TCP 的 Keepalive,是由 TCP 层(内核态) 实现的,称为 TCP 保活机制 HTTP 的 Keep-Alive HTTP 是基于…...
qt完善登录界面(2023-4-6)
点击登录按钮后,判断账号和密码是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮ok和cancel,点击ok后,会清除密码框中的内容…...
104.(cesium篇)cesium卫星轨道模拟
听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en"> <...
Linux shell编程
Shell脚本入门 touch helloWorld.sh 【创建脚本文件】 vim helloWorld.sh 【编辑文件】 以#!/bin/bash开头 echo "helloWorld" 调用脚本 方式一:bash 【绝对路径|相对路径】 方式二:chomd x helloWorld.sh 绝对…...
Rasa 3.x 学习系列-Rasa [3.5.4] -2023-04-05新版本发布
Rasa 3.x 学习系列-Rasa [3.5.4] -2023-04-05新版本发布 Rasa Pro 3.5 中引入的两项新功能将帮助您更好地测试和保护您的 AI 助手:端到端测试和机密管理。 端到端测试 通过全面的验收和集成测试评估 AI 助手的性能。我们易于更新的端到端测试可以设置为运行每个流程和集成,…...
进程和线程
1.实现多线程 进程:是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 线程:是进程中的单个顺序控制流,是一条执行路径 单线程:一个进程如果只有一条执行路径,则称为单线…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
