设计模式 - 行为型考点模式:责任链模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录

一、行为型模式

1.1、责任链模式

1.1.1、概述

1.1.2、案例实现

1.1.3、优缺点

1.1.4、使用场景


一、行为型模式


1.1、责任链模式

1.1.1、概述

为了避免请求发送者和多个请求处理者耦合在一起,就将所有请求处理者通过前一个对象记住下一个对象的引用的方式形成一条链;当有请求到来时,可以将请求沿着这条链传递,知道有对象能处理他为止.

例如,公司员工请假,可以批假的领导有小组组长、部门经理、总经理,但是每个领导比准的天数不同,那么员工请假时,就需要记住每一个领导的能请假的天数,十分不方便,但是通过责任链模式,你就可以直接把假条先交给能处理天数最少的人即可,如果小组组长处理不了,小组组长因为持有 部门经理 的引用,就可以找到他,让他处理..... 以此类推,直到找到能处理这个假条的领导为止.

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

  • 抽象处理者:定义一个处理请求的接口,包含抽象处理方法并持有下一个处理者的引用.
  • 具体处理者:实现抽象处理者的处理方法,判断当前处理者能否处理请求,如果可以就处理,不可以就交给下一个处理者处理.(例如上述的,小组组长、部门经理、总经理)
  • 客户类:创建处理链,并向链头的具体处理者对象提交请求,他不关心具体的处理细节和请求的传递过程.

1.1.2、案例实现

实现上述案例.

/*** 请假条类*/
public class LeaveRequest {//请假人姓名private String name;//请假天数private int num;//请假原因private String reason;public LeaveRequest(String name, int num, String reason) {this.name = name;this.num = num;this.reason = reason;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getReason() {return reason;}public void setReason(String reason) {this.reason = reason;}}
/*** 抽象处理者*/
public abstract class Handler {//请假天数protected static final int ONE_DAY = 1;protected static final int THREE_DAY = 3;protected static final int SEVEN_DAY = 7;//各级领导能处理请假天数区间private int numStart;private int numEnd;//领导的领导private Handler nextHandler;/*** 领导处理请假天数区间* @param numStart* @param numEnd*/public Handler(int numStart, int numEnd) {this.numStart = numStart;this.numEnd = numEnd;}public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}/*** 提交请假请求*/public final void submit(LeaveRequest request) {if(request.getNum() <= numEnd) {this.handlerLeave(request);} else if(this.nextHandler != null) {nextHandler.submit(request);} else {System.out.println("请假天数超过上限!");}}protected abstract void handlerLeave(LeaveRequest request);}
/*** 具体处理者: 小组组长*/
public class GroupLeader extends Handler {/*** 小组长所能处理的请假天数区间*/public GroupLeader() {super(0, ONE_DAY);}@Overrideprotected void handlerLeave(LeaveRequest request) {System.out.println(request.getName() + "请假 " + request.getNum() + " 天," +request.getReason());System.out.println("小组长审批通过");}}
/*** 具体处理者: 部门经理*/
public class Manager extends Handler {/*** 经理所能处理的请假天数区间*/public Manager() {super(ONE_DAY, THREE_DAY);}@Overrideprotected void handlerLeave(LeaveRequest request) {System.out.println(request.getName() + "请假 " + request.getNum() + " 天," +request.getReason());System.out.println("部门经理审批通过");}}
/*** 具体处理者: 总经理*/
public class GeneralManager extends Handler {/*** 经理所能处理的请假天数区间*/public GeneralManager() {super(THREE_DAY, SEVEN_DAY);}@Overrideprotected void handlerLeave(LeaveRequest request) {System.out.println(request.getName() + "请假 " + request.getNum() + " 天," +request.getReason());System.out.println("总经理审批通过");}}
/*** 客户类*/
public class Client {public static void main(String[] args) {//1.假条LeaveRequest request1 = new LeaveRequest("李白", 1, "这几天要出诗集~");LeaveRequest request2 = new LeaveRequest("杜甫", 3, "生病了,身体不适~");LeaveRequest request3 = new LeaveRequest("龙洋静", 6, "着急结婚!");//2.责任链关系GroupLeader groupLeader = new GroupLeader();Manager manager = new Manager();GeneralManager generalManager = new GeneralManager();groupLeader.setNextHandler(manager);manager.setNextHandler(generalManager);//3.提交假条groupLeader.submit(request1);System.out.println("===============");groupLeader.submit(request2);System.out.println("===============");groupLeader.submit(request3);}}

执行结果如下:

1.1.3、优缺点

优点:

  1. 解耦合:降低了发送请求者和处理请求者的耦合度.
  2. 满足开闭原则:可以根据业务需求,新增请求处理类.
  3. 增强了对象指派责任的灵活性:当工作流程发生变化,可以动态的改变链内成员或者修改他们的次序,也可以动态的新增和删除责任.
  4. 简化了对象链接:一个对象只需要持有下一个后继者的引用,不需要保持其他所有处理者的引用,避免了众多的 if else 语句.
  5. 满足单一职责:每个类只需要处理自己的工作,不能处理就交给下一个对象完成.

缺点:

不能保证每一个请求一定被处理:因为请求没有明确的接收者,因此不能保证他一定被处理,该请求可能传到链末也得不到处理.

性能影响:如果责任链较长,请求的处理可能涉及到多个对象,性能会有所损耗.

复杂度:责任链的合理性全靠客户端来保证,增加了客户端的复杂度.

1.1.4、使用场景

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

2. 请求者不明确要对哪一个对象进行提交申请.

例如像公司职级审批流的设定.

例如用户找回密码需要一步步校验的密保信息.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联邦学习综述二

联邦学习漫画 联邦学习漫画链接: https://federated.withgoogle.com/ Federated Analytics: Collaborative Data Science without Data Collection 博客链接: https://blog.research.google/2020/05/federated-analytics-collaborative-data.html 本篇博客介绍了联邦分析&a…

Filebeat、metricbeat、kafka

kibana机子上安装filebeat&#xff08;因为有nginx&#xff09; 上传filebrat包 在es概览查看 上传metricbeat 排错 tailf !$ Kibana-Vlsualize查看 kafka(卡夫卡) kafka是一个分布式的消息发布—订阅系统&#xff08;kafka其实是消息队列&#xff09;消息队列中间件 Kafka的…

Pycharm远程debug代码,一直进入remote_sources

最近debug发现代码一直跳转到 AppData\Local\JetBrains\PyCharm2022.2\remote_sources\xxx这样的目录下&#xff0c;查找百度也没有找到解决的方法。 最后发现&#xff0c;在Run的配置这&#xff0c;有一个Path mappings是空的&#xff0c;把这里的映射填成本地项目和远程项目…

HDR-ISP_unpack_depwl_01_20231002

https://github.com/JokerEyeAdas/HDR-ISP/tree/main 1.unpack&#xff1a;解析raw图 (1)unpack&#xff1a;2个字节1个像素 (2)mipi10&#xff1a;5个字节4个像素 [p1 9:2][p2 9:2][p3 9:2][p4 9:2][(p1 1:0)(p2 1:0)(p3 1:0)(p4 1:0)] (3)mipi12&#xff1a;3个字节2个像…

vscode安装svn扩展(windows)

一、安装 1.1 环境说明 操作系统 windows 10 1.2 安装过程 1. 安装svn 双击安装程序 点击next 继续next 继续next 点击Install 在弹出框中点击 是 开始安装进度&#xff0c;一会将安装成功 安装结束 右键菜单栏中已经有svn选项&#xff0c;并且能正常拉取以…

vue3+elementui实现表格样式可配置

后端接口传回的数据格式如下图 需要依靠后端传回的数据控制表格样式 实现代码 <!-- 可视化配置-表格 --> <template><div class"tabulation_main" ref"myDiv"><!-- 尝试过在mounted中使用this.$refs.myDiv.offsetHeight,获取父元素…

[NPUCTF2020]ezinclude 文件包含两大 getshell方式

PHP LFI 利用临时文件 Getshell 姿势 | 码农家园 说一下我的思路吧 robots没有 扫描发现存在 dir.php 然后404.html 报错 apache 2.18 ubuntu 这个又正好存在漏洞 所以前面全去看这个了 结果根本不是这样做。。。 正确的思路是这样 发现变量 认为是 name和 pass传递参数…

Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行

一、前言 由于 Jetson 系列的开发板 CPU 性能不是很好&#xff0c;因此在处理图像数据时往往需要 GPU 加速&#xff0c;而 VINS-Fusion 是针对同步定位与建图&#xff08;SLAM&#xff09;问题中十分出色的视觉算法&#xff0c;但是其在图像处理过程中资源消耗较大&#xff0c…

HTML 笔记:初识 HTML(HTML文本标签、文本列表、嵌入图片、背景色、网页链接)

1 何为HTML 用来描述网页的一种语言超文本标记语言(Hyper Text Markup Language)不是一种编程语言&#xff0c;而是一种标记语言 (markup language) 2 HTML标签 HTML 标签是由尖括号包围的关键词&#xff0c;比如 <html> 作用是为了“标记”页面中的内容&#xff0c;使…

抖音手机实景无人直播间怎么搭建?

手机无人直播已成为用户直播和商家直播带货的一项热门技术趋势&#xff0c;为消费者提供了全新的观看体验。无人直播&#xff0c;顾名思义&#xff0c;即通过无人直播软件或数字人来进行无人直播。这一技术的广泛应用&#xff0c;不仅为短视频渠道带来了更丰富的玩法&#xff0…

【排序算法】选择排序

文章目录 一&#xff1a;基本介绍1.1 概念1.2 算法思想1.3 思路分析图1.4 思路分析1.5 总结1.5.1 选择排序一共有数组大小-1轮排序1.5.2 每一轮排序&#xff0c;又是一个循环&#xff0c;循环的规则如下&#xff08;在代码中实现&#xff09;&#xff1a; 二&#xff1a;代码实…

【ComfyUI】MacBook Pro 安装(Intel 集成显卡)

文章目录 环境概述配置pip镜像配置pip代理git配置&#xff08;选配&#xff09;下载comfyUI代码创建、激活虚拟环境下载依赖安装torchvision启动comfyUI为什么Mac不支持CUDA&#xff0c;即英伟达的显卡&#xff1f;安装Intel工具包 环境 显卡&#xff1a;Intel Iris Plus Grap…

017-第三代软件开发环境搭建

第三代软件开发环境搭建 文章目录 第三代软件开发环境搭建项目介绍实体机安装Ubuntu系统安装Qt安装GCC & G安装 OPen GL安装Git配置用户名和邮箱生成 SSH 安装VS Code安装Chrome安装搜狗输入法安装字体查看字体拷贝字体到目标机拷贝字体到目标机字体目录安装字体重启设备 安…

【CVPR 2023】 All are Worth Words: A ViT Backbone for Diffusion Models

All are Worth Words: A ViT Backbone for Diffusion Models, CVPR 2023 论文&#xff1a;https://arxiv.org/abs/2209.12152 代码&#xff1a;https://github.com/baofff/U-ViT 解读&#xff1a;U-ViT: A ViT Backbone for Diffusion Models - 知乎 (zhihu.com) All are W…

进阶JAVA篇-Object类与Objects类、包装类的常用API(一)

目录 API 1.0 API概念 2.0 Object类的常用API 2.1 Object 中的 tostring() 方法 表示返回对象的字符串表达形式 2.2 Object 中的 equals(Object o) 方法 &#xff0c;判断两个对象的是否相等 2.2.1深入了解如何重写Object 中的 equals(Object o) 方法 2.2.2 对重写Object 中的…

C++医院影像科PACS源码:三维重建、检查预约、胶片打印、图像处理、测量分析等

PACS连接DICOM接口的医疗器械&#xff08;如CT、MRI、CR、DR、DSA、各种窥镜成像系统设备等&#xff09;&#xff0c;实现图像无损传输&#xff0c;实现DICOM胶片打印机回传打印功能&#xff0c;支持各种图像处理&#xff0c;可以进行窗技术调节&#xff0c;与登记台管理系统共…

差模电感和共模电感的差别

一、初步了解差模、共模的概念 超链接&#xff0c;点击鼠标打开&#xff1a;X电容和Y电容&#xff1b;差模与共模初认识 二、差模和共模电感的二者区别 共模电感和差模电感&#xff0c;是电路中常用的滤波电感、EMI器件&#xff0c;两者经常以环形电感线圈的方式存在。 首先…

【蓝桥·算法双周赛】蓝桥杯官方双周赛震撼来袭

1. 赛事前言 \space\space 大家好&#xff0c;我是执梗。在蓝桥杯中获得过十三届 Java B 组国一以及十四届 C B 组的国一。今天主要为大家带来一个好消息&#xff0c;蓝桥杯将为各位喜爱算法的小伙伴带来全新的算法双周赛。如果你热爱算法竞赛&#xff0c;或者准备参加十五届的…

firefox的主题文件位置在哪?记录以防遗忘

这篇文章写点轻松的 最近找到了一个自己喜欢的firefox主题,很想把主题的背景图片找到,所以找了下主题文件所在位置 我的firefox版本:版本: 118.0.1 (64 位)主题名称: Sora Kawai 我的位置在 C:\Users\mizuhokaga\AppData\Roaming\Mozilla\Firefox\Profiles\w0e4e24v.default…

【开源电商网站】(2),使用docker-compose和dockerfile进行配置,设置自定义的镜像,安装插件,增加汉化包,支持中文界面汉化。

项目相关代代码地址 相关内容&#xff1a; https://blog.csdn.net/freewebsys/category_12461196.html 原文地址&#xff1a; https://blog.csdn.net/freewebsys/article/details/133666433 包括以下运行的详细代码&#xff1a; https://gitee.com/study-demo-all/oscommerc…