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

news/2024/5/19 12:15:21 标签: 设计模式, 责任链模式

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

一,定义

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

责任链模式比较好理解,可以将它比做为一列火车,每一节车厢都是一个对象,每一个对象都有不同处理逻辑(每一节车厢都有它唯一的座位号),如果我们的座位号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.niftyadmin.cn/n/5198233.html

相关文章

【shell】初识shell脚本语言

目录 前言 一、shell脚本基础 1、shell的作用 2、shell脚本的本质 3、shell脚本的格式 4、执行脚本的方式: 4.1使用指定的shell解释器:(不需要脚本有执行权限) 4.2路径的方式: 4.3使用source和“.”执行脚本&a…

聊一聊小程序单聊页面构思

主题界面构建 主题界面构建可以有很多种做法,一种为左右平分式UI设计,简单来说就是对方和我方聊天DOM各占屏幕的一半,完全可以使用flex的布局以及vw构建,一种吧聊天内容作为整体聊天界面的子节点,聊天container内容的高…

进程保活-账号同步实现

账户同步的作用 : 如果应用的数据发生了改变 , 可以通过账户进行同步 , 进而与服务器进行数据同步操作 , 执行同步时 , 系统会拉活对应的应用进程 ; 实现的话,主要是应用 APP 中可以注册 " 账户服务 Service " , 应用安装后 , 如果系统发现应用中有该类型…

ArcEngine:如何进行缩放图层、属性信息显示、状态栏显示?

01 前言 如果以后不是工作相关,我或许以后再难了解ArcEngine相关的GIS桌面软件二次开发的内容? 02 要求 创建窗体应用程序;(10分)修改窗口标题为本人的“学号 姓名”;(5分)添加主…

Labview中for循环“无法终止”问题?即使添加了条线接线端,达到终止条件后,仍在持续运行?

关键: 搞清楚“运行”和“连续运行”两种运行模式的区别。 出现题目中所述问题,大概率是因为代码运行在“连续运行“模式下。 可以通过添加 探针 的方式,加深理解!

Vue3的watch使用介绍及场景

目录 一、watch的使用 1. 监听一个变量 2. 监听一个对象的属性 3. 监听一个函数的返回值 二、watch的使用场景 1. 监听表单的变化 2. 监听路由参数的变化 3. 监听Vuex中的数据变化 三、watch的效果图 四、watch的示例 以上就是Vue3的watch的介绍,watch是…

11月20日,每日信息差

今天是2023年11月20日,以下是为您准备的10条信息差 第一、Aboitiz与可口可乐欧洲合作伙伴公司宣布联合收购可口可乐菲律宾公司 第二、微软首席执行官纳德拉:OpenAI创始人Sam Altman和Brockman将加入微软 第三、WeLab于印尼推出旗下第二家数字银行 第…

Python实现精确控制asyncio并发过程中的多个任务(1)

前言 本文是该专栏的第37篇,后面会持续分享python的各种干货知识,值得关注。 asyncio是Python中并发编程的一种实现方式,它是Python3.4版本引入的标准库,直接内置了对异步IO的支持。异步,就是多个任务之间执行没有先后顺序,可以同时运行,执行的先后顺序不会有什么影响,…