引用百科

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式涉及到的角色:
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。抽象方法handleRequest()规范了子类处理请求的操作。
● 具体处理者(RealHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

案例:

如:有个请假需求,根据不同的请假天数进行不同的审批

<=2天,只项目经理审批 RealHandlerC

>2,<=5天,需要到部门经理审批 RealHandlerB

>5天,需要总经理审批 RealHandlerA

如下:

具体代码实现如下:


1、抽象处理类角色

// 抽象处理者角色类
public abstract class Handler {/*** @Description: 定义处理方法* @param date 请假天数*/public abstract void requestHand(int date);// 过滤器对象private Handler resource;public Handler getResource() {return resource;}public void setResource(Handler resource) {this.resource = resource;}}

2、具体实现类

//具体处理者角色C(项目经理)
public class RealHandlerC extends Handler {@Overridepublic void requestHand(int date) {System.out.println("C 条件过滤...");if (date <= 2) {System.out.println("C处理请求!");} else {if (this.getResource() != null) {System.out.println("天数为" + date + ",C交给下一级处理!");this.getResource().requestHand(date);}}}
}//具体处理者角色B(部门经理)
public class RealHandlerB extends Handler {@Overridepublic void requestHand(int date) {System.out.println("B 条件过滤...");if (date <= 5) {System.out.println("B处理请求!");} else {if (this.getResource() != null) {System.out.println("天数为" + date + ",B交给下一级处理!");this.getResource().requestHand(date);}}}
}//具体处理者角色A(总经理)
public class RealHandlerA extends Handler {@Overridepublic void requestHand(int date) {System.out.println("A 条件过滤...");if (date > 5) {System.out.println("A处理请求!");} else {if (this.getResource() != null) {System.out.println("天数为" + date + ",A交给下一级处理!");this.getResource().requestHand(date);}}}
}

3、客户端Client测试

public class Client {private static void vacation() {// 组装责任链Handler chainA = new RealHandlerA();Handler chainB = new RealHandlerB();Handler chainC = new RealHandlerC();// chainC => chainB =>chainAchainC.setResource(chainB);chainB.setResource(chainA);// 测试,模拟请假天数进行审批chainC.requestHand(1);System.out.println("------------分割线------------");chainC.requestHand(4);System.out.println("------------分割线------------");chainC.requestHand(6);}public static void main(String[] args) {vacation();}
}

以上用请假案例简单的模拟了责任链模式,输出:

C 条件过滤...
C处理请求!
------------分割线------------
C 条件过滤...
天数为4,C交给下一级处理!
B 条件过滤...
B处理请求!
------------分割线------------
C 条件过滤...
天数为6,C交给下一级处理!
B 条件过滤...
天数为6,B交给下一级处理!
A 条件过滤...
A处理请求!

使用说明:
1、使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,
2、将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

Java设计模式_(行为型)_责任链模式相关推荐

  1. Java设计模式之行为型:责任链模式

    背景: 学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字.三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字! 上图将学生.辅导员.系主任.院长.校长组 ...

  2. Java设计模式之行为型:中介者模式

     前言: 在我们的生活中处处充斥着"中介者",比如你租房.买房.找工作.旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌 ...

  3. 【设计模式系列】行为型之责任链模式

    目录 背景 理论 实践 总结 背景 责任链模式,小编在自己项目迭代过程也参与了维护和设计实现:本篇博文主要针对该设计模型进行总结和实践: 简单举例日常生活或者工作中能够接触的责任链模式场景:采购审批流 ...

  4. java责任链模式做优惠_Java设计模式菜鸟系列(十八)责任链模式建模与实现

    责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该 ...

  5. 设计模式笔记十四:责任链模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 责任链模式 顾名思义,责任链模式(Chain of Responsibi ...

  6. 23种设计模式(11):责任链模式

    定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式. 类图: 首先来看一段代码: p ...

  7. 从真实项目中抠出来的设计模式——第三篇:责任链模式

    一:现实场景 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给实体赋值,如果是短信,邮件又是其他方式的赋 ...

  8. 设计模式的C语言应用-责任链模式-第三章

    模式介绍 责任链将需要触发的对象组成一条链,发送者将请求发给链的第一个接收者,并且沿着这条链传递,直到有一个对象来处理它或者直到最后也没有对象处理而留在链末尾端. 图表 1责任链模式流程图 责任链在C ...

  9. 【设计模式】第五章 责任链模式

    第五章 责任链模式 文章目录 第五章 责任链模式 一.介绍 二.结构 三.实现 一.介绍 在现实生活中,一个事件需要经过多个对象处理是很常见的场景.例如,采购审批流程.请假流程等.公司员工请假,可批假 ...

  10. 设计模式学习总结(二十一)--责任链模式

    定义 职责链模式就是避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 在职责链模式中我们可以随时随地的增加或者更改一 ...

最新文章

  1. sql08 访问接口没有oraoledb_状态接口的实现方式讨论
  2. 与其他CA合作签发证书 谷歌赛门铁克之争接近尾声
  3. 128条形码计算,利用Code 128字体实现条码打印
  4. 计算属性|| 计算属性与方法的区别:计算属性是基于它们的依赖进行缓存的 ;方法不存在缓存||侦听器
  5. EasyX识别不到VC++6.0
  6. Error when loading the SDK:发现了含有元素 'd:skin' 开头的无效内容
  7. MyBatis 的工作流程分析
  8. MD5加密解密简介和应用
  9. mysql安装教程刘猿猿_mysql安装
  10. android中利用实现二级联动的效果
  11. centos7安装samba文件服务器,Centos7.7部署文件共享服务Samba
  12. Android 中流量、电量、弱网环境怎么测?
  13. 51nod 1268最大距离
  14. php kindeditor远程图片上传,KindEditor远程跨域上传的实现
  15. 关于导出聊天记录这件事……
  16. EINT、DINT、ERTM、DRTM和INTM、DBGM解析
  17. Java 网络编程:(七)UDP网络编程
  18. java做小游戏扫雷(附源码)
  19. 2022年最热门三款骨传导测评推荐:骨传导选购指南分享,骨传导耳机选哪款好?
  20. python案例——体脂率项目

热门文章

  1. 高速贴片机为什么会出现元器件识别错误
  2. 银行系统中数据存储问题
  3. JavaScript jQuery js node.js
  4. Android软键盘的换行键换成其他键
  5. 飞浆EasyDL半自动标注语义分割及数据导出
  6. 链表amp;双指针-以快慢指针查找环形链表中链表环的第一个结点为例
  7. 关键词短语生成的无监督方法12——Train.py
  8. 【嵌入式学习——知识点总结】几种排序算法
  9. 语法基础——C++语法基础
  10. 秒懂神经网络并利用一行Python代码建立——代码详细参数思维导图,个人见解,希望可以帮助小白