1.什么是责任链设计模式

责任链设计模式主要构成有抽象处理者、具体处理者、客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样所有处理对象都有机会处理请求,使发送者与接受者解耦

在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。

2.责任链模式的优点/缺点和使用场景

使用责任链模式的优点:

  • 发送者与接收方的处理对象类之间解耦
  • 封装每个处理对象,处理类的最小封装原则
  • 可以任意添加处理对象,调整处理对象之间的顺序,提高了维护性和可拓展性可以根据需求新增处理类,满足开闭原则
  • 增强了对象职责指派的灵活性,当流程发生变化的时候可以动态的改变链内的调动次序可动态的新增或者删除
  • 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  • 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

使用责任链模式的缺点:

  • 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  • 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

使用场景:

当请求来到时,不知道由哪一个具体的对象(方法)或者每个对象都需要处理请求的时候,可以使用责任链模式。比如在常见的OA办公系统,当一个员工发起请假的申请,需要经过(开发组长-部门经理-总经理等)使用不同的封装类组成一个处理链路,使用这个处理链路去处理该员工发起的请求

3.责任链模式与策略模式的区别

策略模式和责任链模式很像,都是有多个对象去处理同一个请求

不同之处在于对于同一个请求,策略模式是可以选择哪个具体的策略类来进行处理而责任链模式不能根据请求去判断使用哪个类来处理,需要链路上的处理类 全部来处理一遍才能得出结果

4. JAVA 代码演示

4.1.编写责任链处理Handler

package com.zhangsan.shard.handler;import lombok.Data;/*** @ClassName DutyHandler* @Description TODO* @Author ZhangSan_Plus* @Date 2021/9/2 16:23* @Version 1.0**/
@Data
public abstract class DutyHandler {protected DutyHandler successor;/*** 请假审批接口** @param message* @param days* @return boolean* @throws* @author ZhangSan_Plus* @Date 2021/9/2 16:56**/public abstract boolean dutyHandler(String message, Integer days);}

4.2 编写开发经理对应的实现

package com.zhangsan.shard.handler;/*** @ClassName ProcessorOne* @Description TODO* @Author ZhangSan_Plus* @Date 2021/9/2 16:26* @Version 1.0**/
public class ProcessorOne extends DutyHandler {/*** 假设开发经理只能处理请假小于1天以内的*/@Overridepublic boolean dutyHandler(String message, Integer days) {System.out.println("处理请求:" + message);System.out.println("请假天数:" + days);if (days <= 1) {System.out.println("开发经理审批通过");return true;} else {System.out.println("请假天数大于一天,开发经理无法处理,交给项目经理处理");setSuccessor(new ProcessorTwo());System.out.println("=====================================");return successor.dutyHandler(message, days);}}@Overridepublic void setSuccessor(DutyHandler dutyHandler) {this.successor = dutyHandler;}@Overridepublic DutyHandler getSuccessor() {return successor;}
}

4.3 编写项目经理的对应实现

package com.zhangsan.shard.handler;/*** @ClassName ProcessorTwo* @Description TODO* @Author ZhangSan_Plus* @Date 2021/9/2 16:33* @Version 1.0**/
public class ProcessorTwo extends DutyHandler {/*** 假设项目经理只能处理10天或者10天以内的审批*/@Overridepublic boolean dutyHandler(String message, Integer days) {System.out.println("处理请求:" + message);System.out.println("请假天数:" + days);if (days <= 10) {System.out.println("项目经理审批通过");return true;} else {System.out.println("请假天数大于十天,项目经理无法处理,交给总记录处理");setSuccessor(new ProcessorThree());System.out.println("=====================================");return successor.dutyHandler(message, days);}}@Overridepublic void setSuccessor(DutyHandler dutyHandler) {this.successor = dutyHandler;}@Overridepublic DutyHandler getSuccessor() {return successor;}
}

4.4 编写总经理对应的实现

package com.zhangsan.shard.handler;/*** @ClassName ProcessorThree* @Description TODO* @Author ZhangSan_Plus* @Date 2021/9/2 16:50* @Version 1.0**/
public class ProcessorThree extends DutyHandler {/*** 总经理可以处理全部天数的审批*/@Overridepublic boolean dutyHandler(String message, Integer days) {System.out.println("处理请求:" + message);System.out.println("请假天数:" + days);System.out.println("总经理审批通过");return true;}@Overridepublic void setSuccessor(DutyHandler dutyHandler) {this.successor = dutyHandler;}@Overridepublic DutyHandler getSuccessor() {return successor;}
}

4.5 编写员工请假审批模拟

package com.zhangsan.shard.handler;/*** @ClassName Staff* @Description TODO* @Author ZhangSan_Plus* @Date 2021/9/2 16:52* @Version 1.0**/
public class Staff {public static void main(String[] args) {ProcessorOne processorOne = new ProcessorOne();processorOne.dutyHandler("张三提交请假审批", 15);}
}

4.6 具体执行结果

5. 责任链模式的扩展

5.1 纯的职责链模式

一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中,要求一个请求必须被某一个处理者对象所接收,不能出现某个请求未被任何一个处理者对象处理的情况。在前面的采购单审批实例中应用的是纯的职责链模式。

5.2 不纯的职责链模式

允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给下家的情况,且一个请求可以最终不被任何接收端对象所接收。

设计模式-责任链(职责链)模式及责任链设计模式的应用相关推荐

  1. 老王讲设计模式(一)——策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 老王最近接到一个工作,上 ...

  2. 十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#

    不在其位,不谋其政! –出自<论语·泰伯> 故事背景 在现实世界中,有很多情况下会遇到一些推卸责任的场景,比如要办理一件事的时候,被告诉你要去做个做这个事情,但是去了这个地方,确告诉要到另 ...

  3. 【设计模式与体系结构】代理模式

    [设计模式与体系结构]代理模式 文章目录 [设计模式与体系结构]代理模式 一.实例分析 二.代码实现 三.实现结果 一.实例分析 (1) 代理模式设计一个房产中介的模拟程序. 要求:房产中介有介绍和代 ...

  4. Java设计模式学习总结(15)——行为型模式之责任链模式

    责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...

  5. 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别

    状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...

  6. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

  7. java责任链模式审批请假_Java设计模式-责任链模式

    Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...

  8. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用

    文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...

  9. 23种设计模式C++源码与UML实现--责任链模式

    责任链模式 Chain of Responsibility CoR模式,也叫责任链模式或者责任连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间 ...

最新文章

  1. SQL Server : T-SQL中拆分字符串的一个自定义函数
  2. 你不知道的事---SringCloud的feign的继承特性
  3. 写在开年:移植wolfssl4.3.0到w60x_sdk_3.04时的一点问题
  4. python settings模块安装_Python settings-helper包_程序模块 - PyPI - Python中文网
  5. powershell some check
  6. Java程序员的日常—— 垃圾回收中引用类型的作用
  7. 计算机二级计划总结,计算机二级细节总结
  8. vc6下usb编程_5款免费的C/C++语言编程器
  9. MyBatis学习总结(27)——Mybatis-Plus使用小技巧
  10. 如何在C#窗体中定义全局变量
  11. 人体存在雷达传感器,毫米波雷达技术探测应用,智能感知静态人体存在
  12. 电工技师技能实训考核装置QY-W601C
  13. 度分秒地理位置转wgs84坐标和2000坐标,2000坐标转wgs84坐标
  14. python实现文本分割
  15. 应广PFS122单片机比较器测供电电源VDD电压带临界点消抖处理
  16. 支撑起SNS的六度分隔理论和150法则
  17. hr面试性格测试30题_HR经典面试30题
  18. jquery实现div的隐藏和显示和点击空白显示隐藏
  19. 使用gif.js根据视频片段生成GIF图
  20. 写作必备文献搜索网大全

热门文章

  1. 漫画大全《浴血商后》
  2. Ubuntu安装NVIDIA英伟达显卡驱动教程
  3. 多线程之NSInvocationOperation
  4. Python入门程序练习题-温度转换
  5. 华为OJ 名字的漂亮度
  6. 大数据“拉网捕鼠” 博时基金马乐深圳受审
  7. css 实现加载动画效果
  8. 让你的服务器和应用不再担惊受怕-阿里云监控配置实战
  9. 【无标题】js基础之数组
  10. 幼儿学数数的c语言程序,‎App Store 上的“幼儿学数数123 - 幼儿入门教学”