Android设计模式--责任链模式

news2024/11/15 9:36:17

无善无恶心之体,有善有恶意之动。知善知恶是良知,为善去恶是格物。

一,定义

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

责任链模式比较好理解,可以将它比做为一列火车,每一节车厢都是一个对象,每一个对象都有不同处理逻辑(每一节车厢都有它唯一的座位号),如果我们的座位号12车厢8A号座位,如果我们从一号车厢进去的,需要一节一节的走到12号车厢。

二,使用场景

1,多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定

2,在请求处理者不明确的情况下,向多个对象中的一个提交一个请求

3,需要动态指定一组对象处理请求

三,具体使用

责任链模式在安卓中最典型的应用就是view事件的传递机制,感兴趣的可以去看下源码是怎么实现的,这里就不再展开了。

下面举一个比较好理解的例子。

假设英雄联盟有五个段位,青铜,白银,黄金,铂金,钻石。每个段位匹配都有相应的匹配机制让你匹配到同段位的玩家。

首先需要创建一个匹配机制的抽象类:

/**
 * 匹配抽象类
 * */
public abstract class Mate {

    protected Mate mMate;

    /**
     * 设置下一个段位
     * */
    public void setNextDan(Mate mate){
        this.mMate =mate;
    }

    /**
     * 匹配游戏
     * */
    public abstract void mateGame(String dan);
}

然后创建具体的匹配机制类:

青铜:

/**
 * 青铜匹配机制
 * */
public class BronzeMate extends Mate{

    @Override
    public void mateGame(String dan) {
        if(dan.equals("bronze")){
            //如果是青铜段位 匹配游戏
            System.out.println("青铜匹配机制开始匹配游戏");
        }else {
            mMate.mateGame(dan);
        }
    }
}

白银:

/**
 * 白银匹配机制
 * */
public class SilverMate extends Mate{

    @Override
    public void mateGame(String dan) {
        if(dan.equals("silver")){
            //如果是白银段位 匹配游戏
            System.out.println("白银匹配机制开始匹配游戏");
        }else {
            mMate.mateGame(dan);
        }
    }
}

黄金:

/**
 * 黄金匹配机制
 * */
public class GoldMate extends Mate{

    @Override
    public void mateGame(String dan) {
        if(dan.equals("gold")){
            //如果是黄金段位 匹配游戏
            System.out.println("黄金匹配机制开始匹配游戏");
        }else {
            mMate.mateGame(dan);
        }
    }
}

铂金:

/**
 * 铂金匹配机制
 * */
public class PlatinumMate extends Mate{

    @Override
    public void mateGame(String dan) {
        if(dan.equals("platinum")){
            //如果是铂金段位 匹配游戏
            System.out.println("铂金匹配机制开始匹配游戏");
        }else {
            mMate.mateGame(dan);
        }
    }
}

钻石:

/**
 * 钻石匹配机制
 * */
public class DiamondMate extends Mate{

    @Override
    public void mateGame(String dan) {
        if(dan.equals("diamond")){
            //如果是钻石段位 匹配游戏
            System.out.println("钻石匹配机制开始匹配游戏");
        }else {
            mMate.mateGame(dan);
        }
    }
}

创建一个玩家类,包含玩家的段位:

/**
 * 玩家
 * */
public class Gamer {
    /**
     * 段位
     * */
    private String dan;

    public Gamer(String dan) {
        this.dan = dan;
    }

    public String getDan() {
        return dan;
    }
}

具体使用:

BronzeMate bronzeMate =new BronzeMate();
SilverMate silverMate =new SilverMate();
GoldMate goldMate =new GoldMate();
PlatinumMate platinumMate =new PlatinumMate();
DiamondMate diamondMate =new DiamondMate();
bronzeMate.setNextDan(silverMate);
silverMate.setNextDan(goldMate);
goldMate.setNextDan(platinumMate);
platinumMate.setNextDan(diamondMate);
Gamer gamer1 =new Gamer("gold");
bronzeMate.mateGame(gamer1.getDan());
Gamer gamer2 =new Gamer("diamond");
bronzeMate.mateGame(gamer2.getDan());

这里有一个黄金和一位钻石玩家开始了匹配,他们不知道内部的匹配机制,他们只需要都使用青铜机制开始匹配就可以,最后都会匹配到和他们段位相同的选手。

最后输出:

至此,就实现了一个简单的责任链模式。

四,总结

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

缺点:对链中请求处理者的遍历,如果处理者太多,必定会影响性能。

总的来说我们完全可以用责任链模式来代替switch case 或者if else等条件判断语句,不过这样做可能也不会带来更好的收益。

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

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

相关文章

AcWing 717. 简单斐波那契

原题链接 题目 以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。 这个数列从第 3 项开始,每一项都等于前两项之和。 输入一个整数 N ,请你输出这个序列的前 N 项。 输入格式 一个整数 N 。 输出格式 在一行中输出斐波那契数列的前 N 项&…

Visio免费版!Visio国产平替软件,终于被我找到啦!

作为一个职场人士,我经常需要绘制各种流程图和图表,而Visio一直是我使用的首选工具。但是,随着公司的发展和工作的需要,我逐渐发现了Visio的优点和不足。 首先,让我们来看看Visio的优点。Visio是一个专业的流程图和图…

生成perf flame性能分析图

flame svg图是一种用来可视化CPU的调用栈的图形,可以帮助分析程序的性能瓶颈。flame svg图的每一列代表一个CPU的采样点,每一行代表一个函数调用,颜色代表不同的函数或模块。flame svg图的高度表示CPU的利用率,宽度表示函数的执行…

PCIe协议加持,SD卡9.1规范达到媲美SSD的速度4GB/s

近日,SD协会(SDA)宣布了最新的SD Express存储卡的进化,将microSD Express存储卡的速度提高了一倍,达到2GB/s,并引入了4个新的SD Express速度等级,以确保新的SD 9.1规范中最低的顺序性能水平。这…

基于梯度算法优化概率神经网络PNN的分类预测 - 附代码

基于梯度算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于梯度算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于梯度优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

常见负载均衡算法/策略(概念)

目录 1.1. 轮循均衡(Round Robin) 1.2. 权重轮循均衡(Weighted Round Robin) 1.3. 随机均衡(Random) 1.4. 权重随机均衡(Weighted Random) 1.5. 响应速度均衡(R…

场景交互与场景漫游-对象选取(8-2)

对象选取示例的代码如程序清单8-11所示: /******************************************* 对象选取示例 *************************************/ // 对象选取事件处理器 class PickHandler :public osgGA::GUIEventHandler { public:PickHandler() :_mx(0.0f), _my…

Excel数据可视化—波士顿矩阵图【四象限图】

EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需…

海云安入选证券期货业网络和数据安全实验室“安全合作伙伴”--助力金融科技产业安全发展

近日,为进一步把握数字经济发展新机遇,推进金融与科技深度融合,推动金融业高质量发展,搭建产业链各方交流分享平台。以“数向金科,智引未来”为主题的2023(第六届)金融科技产业大会在北京举办。…

#gStore-weekly | gAnswer的使用

gAnswer能够将自然语言问题转化成包含语义信息的查询图,然后,将查询图转化成标准的SPARQL查询,并将这些查询在图数据库中执行,最终得到用户的答案。这篇文章将介绍gAnswer的使用。 目前gAnswer仅仅提供了HTTP API,以J…

1688API接口接入|阿里1688-B类电商基础链路专业化体验升级

新挑战,新契机! 当下整个互联网的竞争环境的变化为我们带来新的机遇和挑战。1688作为连接中小生产商、贸易商和零售商的源头货源首选平台,持续不断地为B类买家提供更专业的服务和更优质的源头厂货供给,打造核心竞争力。 面对新的…

管家婆订货易在线商城任意文件上传漏洞复现

0x01 产品简介 管家婆订货易,帮助传统企业构建专属的订货平台,PC微信APP小程序h5商城5网合一,无缝对接线下的管家婆ERP系统,让用户订货更高效。支持业务员代客下单,支持多级推客分销,以客带客,拓…

比赛调研资料

视觉文旅 现有的模型 数据 功能 精准营销 基于地理推荐能力 乡村圈分析能力 都市圈分析能力 产品体系 三大数据平台 携程问道 旅游服务框架:前置(推荐种草),途中(客服),售后&#xff0…

淘宝商品详情数据接口(Taobao.item_get)

淘宝商品详情接口是一种程序化的接口,允许开发者根据商品ID或商品链接,获取淘宝平台上的商品详细信息。通过这个接口,开发者可以方便地获取商品的标题、价格、销量、描述等数据,进而提供给用户进行展示和购买。 使用淘宝商品详情…

基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码

基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于饥饿游戏优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

前端入门(二)Vue2到Vue3

文章目录 Vue简介Vue的特点Hello, Vue Vue基本语法模板语法数据绑定(v-bind、v-model)el与data的两种写法 数据代理实现原理Object.defineProperty()数据代理 事件处理(v-on:click / click)事件修饰符键盘事件(略&…

关于RecyclerView的瀑布流 分割线左右间距问题

记录一下开发遇到的RecyclerView 的 瀑布流 左右间距设置问题。 在GridLayoutManager中 ,item的布局顺序为 在该布局中,他的index就是左右左右,position所对应的itemView就是准确的。即 左0,右1,左2,右3&a…

卷积神经网络(VGG-19)灵笼人物识别

文章目录 前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)我的环境: 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集5. 归一化 三、构建VGG-19网络1. 官方模型(已打包好&#xff…

中国农业开启加速度,龙江农业迎来黄金期

​ “中国下一个发展动力将是大农业,而黑龙江大农业正在成为世界农业中心。” 在前不久举办的首届龙商大会暨中国(黑龙江)国际绿色食品产业高质量发展论坛(下文简称“论坛”)上,大北农科技集团股份有限公…

一段来自《Verilog HDL 高级数字设计》的错误Verilog代码

笔者之前在阅读《Verilog HDL 高级数字设计》时的基4布斯乘法器一文时,就遇到了一段有问题的代码,而这个问题可以用Verilog基础:表达式位宽的确定(位宽拓展)文中的分析完美解决。 always (negedge clock) if (Start)…