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

android 责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

在 Android 开发中,责任链模式非常有用,尤其是在处理事件传递、拦截器等方面。下面我们详细讲解它的概念以及如何在 Android 中使用责任链模式。

 

责任链模式的概念

责任链模式主要包含以下几个角色:

  1. Handler(处理者):定义一个处理请求的接口,并实现该接口。
  2. ConcreteHandler(具体处理者):具体的处理者,实现处理请求的逻辑。如果不能处理,则将请求传递给下一个处理者。
  3. Client(客户端):客户端创建具体的处理者对象,并组装成一条链,最终将请求传递给链的起始处理者。

Android 中的使用示例

以下是一个简单的责任链模式示例,在这个示例中,我们创建一个日志处理系统,不同级别的日志处理器(信息、警告、错误)将组成一个责任链,按顺序处理日志请求。

 步骤1:定义处理者接口

public abstract class Logger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;// 责任链中的下一个元素protected Logger nextLogger;public void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}public void logMessage(int level, String message) {if (this.level <= level) {write(message);}if (nextLogger != null) {nextLogger.logMessage(level, message);}}protected abstract void write(String message);
}

 步骤2:创建具体的处理者

public class InfoLogger extends Logger {public InfoLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("INFO: " + message);}
}public class DebugLogger extends Logger {public DebugLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("DEBUG: " + message);}
}public class ErrorLogger extends Logger {public ErrorLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("ERROR: " + message);}
}

 步骤3:创建责任链

public class ChainPatternDemo {private static Logger getChainOfLoggers() {Logger errorLogger = new ErrorLogger(Logger.ERROR);Logger debugLogger = new DebugLogger(Logger.DEBUG);Logger infoLogger = new InfoLogger(Logger.INFO);infoLogger.setNextLogger(debugLogger);debugLogger.setNextLogger(errorLogger);return infoLogger;}public static void main(String[] args) {Logger loggerChain = getChainOfLoggers();loggerChain.logMessage(Logger.INFO, "This is an information.");loggerChain.logMessage(Logger.DEBUG, "This is a debug level information.");loggerChain.logMessage(Logger.ERROR, "This is an error information.");}
}

 

在 Android 中的实际应用

在 Android 中,责任链模式可以用于处理许多情况,例如:

  1. 事件传递:View 的触摸事件传递(onTouchEventdispatchTouchEvent 和 onInterceptTouchEvent)。
  2. 请求拦截:网络请求拦截器链(如 OkHttp 的 Interceptor)。
  3. 日志处理:不同级别的日志记录处理。
示例:自定义事件分发

在 Android 中,我们可以使用责任链模式来自定义视图的事件分发机制:

public class CustomViewGroup extends ViewGroup {@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {// 自定义事件分发逻辑boolean handled = super.dispatchTouchEvent(ev);if (!handled) {// 责任链模式传递给子视图for (int i = 0; i < getChildCount(); i++) {View child = getChildAt(i);if (child.dispatchTouchEvent(ev)) {return true;}}}return handled;}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// 自定义事件拦截逻辑return super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 自定义事件处理逻辑return super.onTouchEvent(event);}// 必须实现的 ViewGroup 抽象方法@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// 布局子视图}
}

总结

责任链模式通过将处理者链成一条链,使得请求在处理者之间传递,直到有一个处理者处理该请求。这种模式在 Android 开发中非常有用,特别是在处理事件传递、拦截器等场景。通过合理使用责任链模式,可以使代码更加模块化和可维护。

 

相关文章:

android 责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一…...

【可控图像生成系列论文(四)】IP-Adapter 具体是如何训练的?1公式篇

系列文章目录 【可控图像生成系列论文&#xff08;一&#xff09;】 简要介绍了 MimicBrush 的整体流程和方法&#xff1b;【可控图像生成系列论文&#xff08;二&#xff09;】 就MimicBrush 的具体模型结构、训练数据和纹理迁移进行了更详细的介绍。【可控图像生成系列论文&…...

堆的实现详解

目录 1. 堆的概念和特点2. 堆的实现2.1 堆向下调整算法2.2堆的创建2.3 建堆时间复杂度2.4 堆的插入2.5 堆的删除2.6 堆的代码实现2.6.1 结构体2.6.2 初始化2.6.3 销毁2.6.4 插入2.6.5 删除2.6.6 获取堆顶2.6.7 判空2.6.8 个数2.6.9 向上调整2.6.10 向下调整3. 堆的实现测试测试…...

iptables配置NAT实现端口转发

加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…...

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(一)芯片性能

【启明智显产品介绍】工业级HMI芯片Model3C详解&#xff08;一&#xff09;芯片性能 Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU&#xff0c;配置平头哥E907&#xff0c;主频400MHz&#xff0c;强大的 2D 图形加速处理器、PNG/JPEG 解码引擎…...

Socket编程【个人简单】

介绍 Socket是计算机网络中的一种通信端点&#xff0c;通过它应用程序可以在网络上发送和接收数据。它可以是基于TCP&#xff08;传输控制协议&#xff09;的流套接字&#xff0c;也可以是基于UDP&#xff08;用户数据报协议&#xff09;的数据报套接字。 TCP、UDP、HTTP和We…...

java入门 grpc测试案例

一、 参考资料 参考孙帅suns教程 https://www.bilibili.com/video/BV13M41157gU/?p3&spm_id_from333.880.my_history.page.click&vd_source4cd1b6f268e2a29a11bea5d2568836ee 二、 服务端 项目目录 maven构建项目 pom.xml <project xmlns"http://maven.a…...

【操作系统】信号处理与阻塞函数|时序竞态问题

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 关于阻塞函数和…...

go语言day4 引入第三方依赖 整型和字符串转换 进制间转换 指针类型 浮点数类型 字符串类型

Golang依赖下载安装失败解决方法_安装go依赖超时怎么解决-CSDN博客 go安装依赖包&#xff08;go get, go module&#xff09;_go 安装依赖-CSDN博客 目录 go语言项目中如何使用第三方依赖&#xff1a;&#xff08;前两步可以忽略&#xff09; 一、安装git&#xff0c;安装程序…...

IOS Swift 从入门到精通:闭包第二部分,高级闭包

文章目录 当闭包接受参数时使用闭包作为参数当闭包返回值时使用闭包作为参数简写参数名称高级闭包: 具有多个参数的闭包高级闭包:从函数返回闭包高级闭包:捕获值总结当闭包接受参数时使用闭包作为参数 这是闭包开始变得有点像线路噪声的地方:传递给函数的闭包也可以接受它…...

爬虫超详细介绍

爬虫&#xff08;Spider&#xff09;是一种自动化程序&#xff0c;用于在互联网上获取信息。 其工作原理主要可以分为以下几个步骤&#xff1a; 发起请求&#xff1a; 爬虫首先需要向目标网站发起HTTP请求&#xff0c;以获取网页的内容。这个请求可以包含一些额外的信息&…...

双向长短期记忆神经网络BiLSTM

先说一下LSTM LSTM 是一种特殊的 RNN&#xff0c;它通过引入门控机制来解决传统 RNN 的长期依赖问题。 LSTM 的结构包含以下几个关键组件&#xff1a; 输入门&#xff08;input gate&#xff09;&#xff1a;决定当前时间步的输入信息对细胞状态的影响程度。遗忘门&#xff…...

python基础篇(4):range语句

1 功能介绍 range语句的功能是获得一个数字序列&#xff08;可迭代类型的一种&#xff09; 2 语法 语法1&#xff1a; range(num) 获取一个从0开始&#xff0c;到num结束的数字序列&#xff08;不含num本身&#xff09; 如range(5)取得的数据是&#xff1a;[0, 1, 2, 3, 4…...

基于STM32的简易计算器proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的简易计算器proteus仿真设计 讲解视频1.主要功能2. 仿真3. 程序4. 设计报告5. 资料清单&下载链接 基于STM32的简易计算器proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 …...

小程序onLoad 和 onShow

onLoad 和 onShow 是小程序页面的生命周期函数&#xff0c;它们在不同的时机触发&#xff0c;具有不同的用途和执行顺序 1.onLoad: &#xff08;1&#xff09;onLoad 在页面加载时触发&#xff0c;仅执行一次。 &#xff08;2&#xff09;用于页面的初始化操作&#xff0c;例如…...

抖音直播违规规定有哪些?(直播违禁词汇总表)

全民直播的同时也有不少新手直播玩家处处碰壁,直播间没人气,直播不知道说什么甚至直播间被封。 收到直播封禁通知的朋友,轻者封禁直播账号两三天,严重着可能永久封禁直播间! 今天我们重点来说说直播间被封是怎么回事?如何避免抖音直播间被封?抖音直播间违规规定有哪些?抖音…...

安卓 jetpack compose

以下是 Jetpack Compose 中常用的一些组件的列表&#xff1a; 组件名称描述Text用于显示文本内容。Button可点击的按钮组件&#xff0c;常用于触发事件。TextField用于输入文本的文本框组件。Image用于展示图片。Column垂直布局容器&#xff0c;可以在其中垂直排列子组件。Row…...

JavaWeb系列十九: jQuery的DOM操作 上

查找节点, 修改属性 查找属性节点: 查找到所需要的元素之后, 可以调用jQuery对象的attr()方法用来 设置/返回 它的各种属性值 设置属性值 $(“img”).attr(“width”, “300”);返回属性值 $(“img”).attr(“width”); 创建节点 创建节点: 使用jQuery的工厂函数$(): $(html标…...

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…...

【激光雷达使用记录】—— 如何在ubuntu中利用ros自带的rviz工具实时可视化雷达点云的数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、查看雷达数据的 frame_id1. 查看雷达数据的话题2. 查看数据的frame_id 二、可视化雷达数据总结 前言 RViz&#xff08;ROS Visualization&#xff09;是机…...

保姆级教程:在IMX6ULL开发板上手把手实现红外遥控器驱动(基于NEC协议与Linux 5.x内核)

从零构建IMX6ULL红外遥控驱动&#xff1a;NEC协议全解析与Linux 5.x实战指南 当你想在嵌入式设备上实现红外遥控功能时&#xff0c;NEC协议驱动的开发往往是第一个需要攻克的堡垒。本文将带你深入理解红外通信原理&#xff0c;并手把手完成从硬件连接到驱动测试的全流程。不同于…...

Gerbv:你的免费PCB设计“翻译官“,让Gerber文件开口说话

Gerbv&#xff1a;你的免费PCB设计"翻译官"&#xff0c;让Gerber文件开口说话 【免费下载链接】gerbv Maintained fork of gerbv, carrying mostly bugfixes 项目地址: https://gitcode.com/gh_mirrors/ge/gerbv 想象一下&#xff0c;当你拿到一份PCB设计文件…...

AI Agent Skill 从入门到精通:定义、结构、调用链路与底层原理

一篇帮你从"知道 Skill 这个词"到"能独立设计生产级 Skill"的系统教学&#xff0c;含 3 个完整实战案例。阅读提示适合谁看&#xff1a;正在做或准备做 AI Agent 开发的工程师&#xff0c;尤其是从传统后端 / 数据仓库转过来的同学看完能做什么&#xff1a…...

学Simulink——电池储能系统(BESS)双向DC-AC逆变器的恒压恒频(V/f)控制

目录 手把手教你学Simulink——电池储能系统(BESS)双向DC-AC逆变器的恒压恒频(V/f)控制 一、背景与挑战 1.1 什么是 V/f 控制?为什么 BESS 需要它? 1.2 核心痛点与设计目标 二、系统架构与核心控制推导 2.1 整体架构:电压源特性的“自主构建” 2.2 核心数学推导:…...

在Windows上安装APK的终极指南:5步掌握APK Installer工具

在Windows上安装APK的终极指南&#xff1a;5步掌握APK Installer工具 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直接安装Android应用…...

吵翻了!龙虾之父晒天价账单,一个月烧了 130 万美元,消耗 6030 亿 Token

前段时间&#xff0c;昆仑万维董事长方汉的一次访谈引发热议&#xff0c;他自曝“一个月才用 20 多亿&#xff0c;有点惭愧。” 他有位 CTO 朋友每月烧 600 亿 token&#xff0c;3 个月完成百名程序员七八年写的 800 万行代码。不过呢&#xff0c;今天小程程刷到一个更绝的案例…...

掌握ComfyUI视频处理:5步构建高效AI视频工作流

掌握ComfyUI视频处理&#xff1a;5步构建高效AI视频工作流 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在AI视频创作和内容制作领域&#xff0c;ComfyUI-Video…...

KeyboardChatterBlocker:免费开源键盘防连击工具终极指南

KeyboardChatterBlocker&#xff1a;免费开源键盘防连击工具终极指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否曾经遇到过键…...

BilibiliDown:跨平台B站视频下载完整解决方案实战指南

BilibiliDown&#xff1a;跨平台B站视频下载完整解决方案实战指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/b…...

5个技巧快速掌握Happy Island Designer:免费在线岛屿设计工具终极指南

5个技巧快速掌握Happy Island Designer&#xff1a;免费在线岛屿设计工具终极指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(A…...