Android设计模式详解之责任链模式

news2024/12/25 12:49:48

前言

责任链模式是行为型设计模式;

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

使用场景:

  • 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定;
  • 在请求处理者不明确的情况下向多个对象中的一个提交一个请求;
  • 需要动态指定一组对象处理请求;

UML类图:
责任链UML
AbstractHandler:抽象处理者角色;
属性:
nextHandler:保持对下一个节点处理者对象的引用;
方法:
handleRequest(AbstractRequest request):处理请求;
getHandleLevel():获取处理者对象的处理级别;
handle():每个处理者对象的具体处理方式;

AbsRequest:抽象请求者角色;
属性:
obj:处理对象;
方法:
getContent():获取具体的处理对象;
getRequestLevel():获取请求级别;

ContrectHandler1ContrectHandler2ContrectHandler3 : 具体的处理者对象;
ContrectRequest1ContrectRequest2ContrectRequest3 : 具体的请求者对象;

Client:客户端调用者;

实现示例

这里举个简单的栗子,忽略UML图中的请求者角色,比如你是公司员工需要请假,3天以内的主管可以直接审批通过,大于3天小于7天的部门经理可以审批通过,如果7天以上的需要董事长才可以审批通过,下面我们就针对这个例子使用责任链模式来实现;

  • 定义抽象领导者类,Leader
/**
 * 抽象领导者
 */
abstract class Leader {
    var nextLeader: Leader? = null


    fun handleRequest(days: Int) {
        if (handleDays(days)) {
            handle(days)
        } else {
            nextLeader?.handleRequest(days)
        }
    }

    /**
     * 当前领导是否可以审批请假天数
     */
    protected abstract fun handleDays(days: Int): Boolean

    /**
     * 具体审批操作
     */
    protected abstract fun handle(days: Int)
}
  • 部门主管处理者,DirectorLeader
/**
 * 部门主管处理者
 */
class DirectorLeader : Leader() {

    override fun handleDays(days: Int): Boolean {
        return days <= 3
    }

    override fun handle(days: Int) {
        println("部门主管审批${days}天假期通过")
    }
}
  • 经理处理者,ManagerLeader
/**
 * 经理处理者
 */
class ManagerLeader : Leader() {

    override fun handleDays(days: Int): Boolean {
        return days <= 7
    }

    override fun handle(days: Int) {
        println("经理审批${days}天假期通过")
    }
}
  • 老板处理者,BossLeader
/**
 * 老板处理者
 */
class BossLeader : Leader() {

    override fun handleDays(days: Int): Boolean {
        return true
    }

    override fun handle(days: Int) {
        println("老板审批${days}天假期通过")
    }
}
  • 测试类
object Test {

    @JvmStatic
    fun main(args: Array<String>) {
        //构造各个领导
        val directorLeader = DirectorLeader()
        val managerLeader = ManagerLeader()
        val bossLeader = BossLeader()
        directorLeader.nextLeader = managerLeader
        managerLeader.nextLeader = bossLeader
        directorLeader.handleRequest(2) //打印结果:部门主管审批2天假期通过
        directorLeader.handleRequest(6) //打印结果:经理审批6天假期通过
        directorLeader.handleRequest(10) //打印结果:老板审批10天假期通过
    }
}

当然,如果部门主管和经理都不在的时候,我们可以直接提交给老板进行处理,这就是责任链模式的灵活之处!

Android源码中的责任链模式

  • View事件分发流程,这里不再过多赘述,大家肯定都比较清楚;
  • OkHttp发起网络请求,通过责任链模式一层一层将请求进行封装并发起最终请求;

总结

优点:
可以对请求者和处理者关系解耦,提高代码的灵活性。

缺点:
需要对链中请求处理者进行遍历,如果处理者太多,会影响性能。

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

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

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

相关文章

基于概率论的MATLAB仿真,内容包括非共轭条件下的后验概率的推导,共轭条件下的非完备集的后验概率的推导

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 1.1先验概率的推导 根据贝叶斯概率论可知&#xff0c;某一事件的后验概率可以根据先验概率来获得&#xff0c;因此&#xff0c;这里首先对事件的先验概率分布进行理论的推导。假设测量的腐蚀数据…

[一个无框架的javaweb demo]番荒之冢 --番剧灯塔站

文章目录番荒之冢 --番剧灯塔站理念大致设计权限分配番剧信息用户/管理员信息邮箱正则匹配URL正则匹配留言信息数据库设计useranimationcommentfavoranim技术栈(无框架)功能一个简单的登录(进行了路由限制, 若未登录都会跳转至此)首页我的我的资料追番清单留言区番剧详情退出登…

华为云-计算云服务介绍

前言 相信很多小伙伴在刚开始接触各类云产品的时候&#xff0c;被各种各样的云产品类如规格、型号、价格、适用场景等问题所困扰。本文就给大家介绍一下华为云常见云产品的规格区别和适用场景。帮助大家选择合适的云产品。 文章目录前言一、计算云服务1.弹性云服务器2.裸金属服…

Apache Flink 部署模式

目录 会话模式 Session Mode 单作业模式 Per-Job Mode (deprecated) 应用模式 Application Mode 在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff1a; i…

ArcGIS | NetCDF数据在ArcMap中的使用

NetCDF又称科学数据集&#xff0c;可以存储温度、湿度、风速、风向等多个维度的文件格式。以中国区域地面气象要素驱动数据集为例进行介绍。 中国区域地面气象要素驱动数据集&#xff0c;包括近地面气温、近地面气压、近地面空气比湿、近地面全风速、地面向下短波辐射、地面向…

P6 PyTorch 常用数学运算

前言&#xff1a; 这里主要介绍一下PyTorch 的常用数学运算 目录&#xff1a; 1&#xff1a; add|sub 加减法 2: mul/div 乘/除运算 3: 矩阵乘法 4 2D矩阵转置 5 其它常用数学运算 6 clamp 梯度剪裁 一 加减法 1.1 加法 可以直接通过符号 或者 torch.add # -*- co…

MySQL数据库的安装、创建库及连接取数

安装MySQL数据库MySQL数据库简介安装MySQL数据库下载安装包安装MySQLMySQL创建一个新的数据库&#xff0c;并在其中创建新的数据表&#xff0c;填充测试数据并查看mysql>模式下输入的每句sql语句都要以;结尾&#xff1b;若多行语句无;&#xff0c;则被默认为一条语句未输入完…

UNIX环境高级编程——1.UNIX基础知识

UNIX基础知识 UNIX体系结构 严格意义上来说&#xff0c;可以将操作系统定义为一种软件&#xff0c;控制计算机硬件资源&#xff0c;提供程序运行环境。通常把这种软件成为内核。内核的接口被成为系统调用&#xff08;system call&#xff09;。公共函数库构建在系统调用接口之…

碳酸锂、碳酸氢锂除钙镁离子交换柱

锂及其盐类是国民经济和国防建设中具有重要意义的战略物资&#xff0c;也是与人们生活息息相关的能源材料。而碳酸锂作为锂盐的基础盐&#xff0c;是制取锂化合物和金属锂的原料&#xff0c;可作铝冶炼的电解浴添加剂&#xff0c;亦可用于合成橡胶、染料、半导体等方面。电池级…

Orin+ GMSL (Ser 9295+Des 9296)流程分析(1)

文章目录 1 前言2 流程分析2.1 整体架构2.2 Ser端2.2 Des端2.3 软件架构2.4 设备树文件分析2.5 VI 接口2.7 CSI 接口1 前言 Maxim 支持GMSL作为汽车行业视频应用的通信链路。GMSL基于SerDes (Serializer-Deserializer)技术;也就是说,它在发送端使用序列化器,在接收端使用反序…

观察UE4中引用查看器(ReferenceViewer)是从哪得到数据的

前言 引用查看器(ReferenceViewer)可以显示资源引用关系数据&#xff0c;我想要知道这个数据是如何得到的。因此从它的界面代码开始一步步往里看。 &#xff08;到最后才发现&#xff0c;得到引用关系数据的接口很简单&#xff0c;而且是蓝图可访问的&#xff0c;详见本篇的【…

冬至已至,你的在职读研2023能在社科院与杜兰大学金融管理硕士项目实现吗

杜甫《小至》中写道“天时人事日相催&#xff0c;冬至阳生春又来”。不知不觉间冬至悄然到来&#xff0c;过完冬至天气日渐回暖&#xff0c;春天即将回来了。时光总是匆匆而逝&#xff0c;一晃2022年将要与我们说再见了。这一年来&#xff0c;反复无常的疫情&#xff0c;瞬息万…

【学习笔记】JDK源码学习之HashTable(附带面试题)

【学习笔记】JDK源码学习之HashTable(附带面试题) 其他好文&#xff1a; 【学习笔记】JDK源码学习之LinkedHashMap&#xff08;附带面试题【学习笔记】JDK源码学习之HashMap&#xff08;附带面试题&#xff09;【学习笔记】JDK源码学习之Vector&#xff08;附带面试题&#x…

OpenCV基础入门

主要了解包括 opencv 的下载和环境配置opencv目录的了解opencv中highgui模块opencv中core模块opencv中imgproc模块opencv中feature2d模块opencv视频操作 1.OpenCV简介 图像是人类视觉的基础&#xff0c;是自然景物的客观反映。 模拟图像通过某种物理量的强弱变化来记录图像…

中小企业远程办公指南:10分钟搭建,即插即用

不装了 我成小阳人了 虽然还没算过来人&#xff0c;但是想要提醒一下小伙伴“能不阳就别阳”&#xff0c;“能晚阳就晚阳”&#xff01; 真的很痛很难受。 为了应对即将到来的高峰&#xff0c;我们在上周末紧急采取了远程居家办公模式。 不得不说&#xff0c;公司应对突发情…

彻底卸载2345王牌输入法的方法

2345王牌输入法是2345公司旗下一款中文输入法软件&#xff0c;主打纯净输入&#xff0c;有用户用了一段时间觉得不太习惯&#xff0c;就想卸载装别的软件&#xff0c;但是发现怎么也卸不掉&#xff0c;下面小编就给大家介绍彻底卸载2345王牌输入法的方法。 方法一&#xff1a;使…

线性代数 --- Gauss消元的部分主元法和完全主元法(补充)

Gauss消元的部分主元法和完全主元法(补充) 本文主要是对下文的补充&#xff0c;而补充的主要内容就是如何直接求出(手动)部分主元法的P矩阵和L矩阵&#xff1a; 线性代数 --- Gauss消元的部分主元法和完全主元法_松下J27的博客-CSDN博客_高斯消元的主元是什么Gauss消元的部分主…

MyBatisPlus ---- MyBatis-Plus简介

MyBatisPlus ---- MyBatis-Plus简介1. 简介2. 特性3. 支持数据库4. 框架结构1. 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 愿景&#xff1a; 我们的…

艾美捷内皮血管生成检测试剂盒的多种特点

血管生成&#xff08;Angiogenesis&#xff09;是指源于已存在的毛细血管和毛细血管后微静脉的新的毛细血管性血管的生长。内皮血管生成是一个极其复杂的过程。通常新生血管是在原有的血管基础上延伸扩展而形成的&#xff0c;其过程类似于典型的伤口愈合和胚胎形成过程。在血管…

RK3568下载SDK编译源码

前面我们已经搭建好了编译一个环境https://blog.csdn.net/qq_24093081/article/details/128394606 所以在这里我们就需要下载瑞芯微提供的SDK进行编译&#xff0c;由于RK3568支持多种系统&#xff0c;比如Android11&#xff0c;Linux&#xff08;debian、Ubuntu、buildroot、yo…