一、介绍

责任链模式(Iterator Pattern),是行为型设计模式之一。什么是”链“?我们将多个节点首尾相连所构成的模型称为链,比如生活中常见的锁链,就是由一个个圆角长方形的铁环串起来的结构。对于链式结构,每个节点都可以被拆开再连接,因此,链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式,这样的解释是不是更通俗易懂呢?我们还是看看责任链模式的标准定义。

二、定义

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

三、使用场景

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

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

  • 需要动态指定一组对象处理请求。

四、责任链模式的UML类图

UML类图:

角色介绍:

  • Handler:抽象处理者角色,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用。

  • ConcreteHandler:具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。

五、简单实现

这个例子我觉得很贴切。我们在公司有各种原因需要报销费用,首先我们要找我们的上级领导去审批,报销额度如果在领导的权限范围内,那就审批通过,否则领导在找自己的上级去审批,以此类推。

抽象领导类:

public abstract class Leader {/*** 上级领导处理者*/protected Leader nextHandler;/*** 处理报账请求* * @param money 能批复的报账额度 * */public final void handleRequest(int money){System.out.println(getLeader());if(money <=limit()){handle(money);}else{System.out.println("报账额度不足,提交领导");if(null != nextHandler){nextHandler.handleRequest(money);}}}/*** 自身能批复的额度权限* * @return 额度*/public abstract int limit();/*** 处理报账行为* * @param money 具体金额*/public abstract void handle(int money);/*** 获取处理者* * @return 处理者*/public abstract String getLeader();
}

在这个抽象的领导类中只做了两件事,一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性,二是声明了一个处理报账请求的方法来确定当前领导是否有能力处理报账请求,如果没有这个权限,则将该请求转发给上级领导处理。接下来则是各个领导类的实现:

组长(额度1000):

public class GroupLeader extends Leader{@Overridepublic int limit() {return 1000;}@Overridepublic void handle(int money) {System.out.println("组长批复报销"+ money +"元");}@Overridepublic String getLeader() {return "当前是组长";}}

主管(额度5000):

public class Director extends Leader{@Overridepublic int limit() {return 5000;}@Overridepublic void handle(int money) {System.out.println("主管批复报销"+ money +"元");}@Overridepublic String getLeader() {return "当前是主管";}}

经理(额度10000):

public class Manager extends Leader{@Overridepublic int limit() {return 10000;}@Overridepublic void handle(int money) {System.out.println("经理批复报销"+ money +"元");}@Overridepublic String getLeader() {return "当前是经理";}}

老板(额度…):

public class Boss extends Leader{@Overridepublic int limit() {return Integer.MAX_VALUE;}@Overridepublic void handle(int money) {System.out.println("老板批复报销"+ money +"元");}@Overridepublic String getLeader() {return "当前是老板";}}

发起申请:

public class Client {public static void main(String[] args) {//构造各个领导对象GroupLeader groupLeader = new GroupLeader();Director director = new Director();Manager manager = new Manager();Boss boss = new Boss();//设置上级领导处理者对象groupLeader.nextHandler = director;director.nextHandler = manager;manager.nextHandler = boss;//发起报账申请groupLeader.handleRequest(8000);}
}

结果:

当前是组长
报账额度不足,提交领导
当前是主管
报账额度不足,提交领导
当前是经理
经理批复报销8000元

责任链模式非常灵活,请求的发起可以从责任链的任何一个节点开始,也可以改变内部的传递规则。比如主管不在,我们完全可以跨过主管直接从组长那里转到经理。

对于责任链中的一个处理者对象,有两个行为。一是处理请求,二是将请求传递到下一节点,不允许某个处理者对象在处理了请求后又将请求传送给上一个节点的情况。

对于一条责任链来说,一个请求最终只有两种情况。一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称为纯的责任链模式,后一种为不纯的责任链。实际中大多为不纯的责任链。

六、Android源码中的责任链模式

1、View事件的分发处理

ViewGroup事件投递的递归调用就类似于一条责任链,一旦其寻找到责任者,那么将由责任者持有并消费掉该次事件,具体体现在View的onTouchEvent方法中返回值的设置,如果返回false,那么意味着当前的View不会是该次的责任人,将不会对其持有;如果返回true,此时View会持有该事件并不再向外传递。

七、总结

优点:

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

缺点:

  • 每次都需要对链中请求处理者遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用者中,要慎用。

Android设计模式之——责任链模式相关推荐

  1. 轻松学习Java设计模式之责任链模式

    我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...

  2. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...

  3. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  4. 手撸设计模式之-责任链模式

    手撸设计模式之-责任链模式 一 .责任链模式介绍 1.1 定义 1.2 责任链模式UML结构图 1.3 责任链模式结构详细 1.3 用例代码实现 二.责任链模式应用场景: 2.1 场景概述 2.2 场 ...

  5. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  6. 软件设计模式之责任链模式实验

    软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...

  7. Java设计模式之责任链模式(二)

    所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...

  8. Java设计模式作业-责任链模式

    Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...

  9. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

最新文章

  1. 看了Linux命令的全称,顿时豁然开朗
  2. Linux操作oracle——关闭、停止、重启
  3. _declspec(naked) 使用(裸函数)
  4. linux yum nginx 安装,Linux下 yum 安装 nginx 以及运维
  5. java面向对象编程知识点总结
  6. 互联网1分钟 |1205
  7. android获取apk名称_安卓逆向——APK安装流程
  8. w ndows10即将停止更新,微软开始警告Windows 10 v1909用户即将停止更新服务
  9. Ubuntu设置root登录
  10. 百度推出Apollo 3.5和Apollo Enterprise
  11. Notepad ++添加到每一行
  12. 图:经过艰苦的代码收官阶段,我的抽奖软件作品终于完工,大家欣赏.从我个人的自我判断来看,其它的抽奖软件都是浮云...
  13. 元胞自动机小团体matlab,元胞自动机matlab程序代码
  14. 算法图解————K 近邻算法
  15. 树莓派(Raspberry Pi)安装五笔输入法,五笔拼音混合输入法
  16. blendshapes
  17. 摄像头各参数的意义_摄像机参数及性能指标浅谈
  18. 什么是最容易涨粉的短视频,拍什么短视频最吸粉
  19. Cheat Engine7.4 训练教程(非常详细)
  20. h5故障代码_美的空调故障代码h5 看完你就知道了

热门文章

  1. 正则匹配括号里面的内容不包括括号_python正则表达式
  2. 【转】2.2 SharePoint服务器端对象模型 之 访问网站和列表数据(Part 2)
  3. 【转】JPA、Hibernate和Mybatis区别和总结
  4. angular8 设置延时时间
  5. String、StringBuffer和StringBuilde的区别
  6. 查询sql语句是否使用索引
  7. 【HDU - 6185】Covering(矩阵快速幂优化二维dp,高斯消元,轮廓线dp打表)
  8. Coursera自动驾驶课程第18讲:The Planning Problem
  9. 机器学习笔记(八):神经网络:学习
  10. 1.UNIX网络编程卷1:源码配置