Java设计模式之java责任链模式详解

 更新时间:2021年09月23日 09:14:43   作者:李阿昀  
这篇文章主要介绍了JAVA 责任链模式的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

在本讲,我们来学习一下行为型模式里面的第四个设计模式,即责任链模式。

概述

在学习责任链模式之前,我们先来看一下下面这段描述。

在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但是每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了员工请假的难度。因为领导有很多,员工到底找哪位领导他还得自己判断,所以这会显得特别特别麻烦。这样的例子还有很多,如找领导出差报销、生活中的"击鼓传花"游戏等。

说了这么多,不知你有没有在公司请过假,要是你请过假,想想是不是这么一回事啊!很显然,在该例子中,请假就是一个请求,而且多个对象都可以处理该请求,有部门负责人、副总经理、总经理等,他们都可以进行批假,但是每个对象的处理条件或权限不同,比如部门负责人有可能只能批1~2天的假,一旦超过这一请假天数,员工就得去找部门负责人的顶头上司,也就是副总经理了,要是还超过了副总经理批假的一个范围的话,那么员工就得再去找总经理批假了,这是不是就增加了员工请假的难度啊!

既然问题出现了,那么又该如何去解决呢?使用责任链模式。那什么又是责任链模式呢?下面我们就来看一看它的概念。

又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一个对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

很多人看完,完全不知道啥意思,这里我就为大家稍微解释解释。就以员工请假案例来说,请求发送者指的就是员工,因为是员工(例如张三)要请假的;多个请求处理者指的是部门负责人、副总经理、总经理等这些人。这样,张三请假的示意图就是下面这样了。

在这里插入图片描述

从上图中可以看到,张三要请假的话,那么他只需要去找自己部门的负责人就可以了,因为对于他来说,他肯定知道自己部门的负责人是谁。然后,部门负责人会根据张三请假的天数来决定是否批假,如果部门负责人能批假,那么自然就帮张三批了;可如果他不能批,那么他就会去找他的顶头上司,即副总经理,因为他们已经连成一条链了。同理,副总经理也是一样,他也会根据他所能批准的请假天数来判断,如果在自己的批准范围之内,那么废话不多说,直接批假;如果批不了的话,那么再去找对应他的顶头上司,即总经理。于此一来,当整个链走完,张三请假的流程就算是结束了。

理解了责任链模式的概念之后,接下来,我们再来看一下责任链模式的结构。

结构

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

  • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接(即记住下一个对象的引用)。

注意了,对于该角色,我们既可以定义成接口,也可以定义成抽象类,一般来说,我们都会定义成抽象类。

  • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,若可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

也就是说,客户类不需要去找对应的对象进行处理,而只需将处理链创建好即可。就拿上述张三请假的示意图来说,他只需要找他自己的部门负责人即可,至于请假流程要经过哪几步,他并不需要去关注。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Java创建多线程的两种方式对比

    Java创建多线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口。那么这两种方式孰优孰劣呢?这就是本文需要探讨的内容范畴了,看官们请仔细向下看
    2014-10-10
  • 谈Java static关键字的用法与好处

    谈Java static关键字的用法与好处

    这篇文章主要为大家详细介绍了Java static关键字的用法与好处,感兴趣的朋友可以参考一下
    2016-05-05
  • 简单介绍线性表以及如何实现双链表

    简单介绍线性表以及如何实现双链表

    本文先介绍线性表的几个基本组成部分:数组、单向链表、双向链表;随后给出双向链表的C、C++和Java三种语言的实现,需要的朋友可以参考下
    2015-07-07
  • Java8之lambda最佳实践_动力节点Java学院整理

    Java8之lambda最佳实践_动力节点Java学院整理

    在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想,我觉得优秀的程序员,有必要学习一下函数式编程的思想以开阔思路
    2017-06-06
  • SpringBoot创建RSocket服务器的全过程记录

    SpringBoot创建RSocket服务器的全过程记录

    RSocket应用层协议支持 Reactive Streams语义, 例如:用RSocket作为HTTP的一种替代方案。这篇文章主要给大家介绍了关于SpringBoot创建RSocket服务器的相关资料,需要的朋友可以参考下
    2021-05-05
  • 解决Mybatis的serverTimezone时区出现问题

    解决Mybatis的serverTimezone时区出现问题

    这篇文章主要介绍了解决Mybatis的serverTimezone时区出现问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java最简洁数据结构之冒泡排序快速理解

    Java最简洁数据结构之冒泡排序快速理解

    冒泡排序是编程中数据结构绕不过的一个基础点,有关于冒泡排序的文章也有很多,但可能会比较缭乱未能理解,本章将一子u为简洁明了的例图带你通关冒泡排序
    2021-11-11
  • 利用Spring Social轻松搞定微信授权登录的方法示例

    利用Spring Social轻松搞定微信授权登录的方法示例

    这篇文章主要介绍了利用Spring Social轻松搞定微信授权登录的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • JAVA中STRING的常用方法小结

    JAVA中STRING的常用方法小结

    这篇文章介绍了JAVA中STRING的常用方法,有需要的朋友可以参考一下
    2013-09-09
  • Java回调函数原理实例与代理模式的区别讲解

    Java回调函数原理实例与代理模式的区别讲解

    今天小编就为大家分享一篇关于Java回调函数原理实例与代理模式的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论