设计模式(20):责任链模式

定义

  • 将能够处理同一请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。

责任链模式角色

  • 抽象处理器(handler): 定义了处理器的处理方法,并维护了下一个处理器对象的引用;
  • 具体处理器(ConcreteHandler): 实现了抽象处理器的处理方法,并确定了当前处理器是否可以处理,如果不能处理,就将请求交给下一个处理器处理;

场景

  • 打牌时,轮流出牌
  • 接力赛跑
  • 大学中,奖学金审批
  • 公司中,公文审批
  • 公司中,请假审批

开发中常见的场景

  • java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch。
  • servlet开发中,过滤器的链式处理。
  • struts2中,拦截器的调用也是经典的责任链模式;

公司里面,请假条的审批流程

  • 如果请假天数小于3天,主任审批;
  • 如果请假天数大于等于3天,小于7天,经理审批;
  • 如果大于等于7天,小于30天,总经理审批;
  • 如果大于30天,提示拒绝。

代码实现

  • 封装请假的基本信息
/*** 封装请假的基本信息*/
public class LeaveRequest {//请假对象private String name; //请假多次时间private int LeaveDays;//请假理由private  String reason;	public LeaveRequest(String name, int leaveDays, String reason) {super();this.name = name;this.LeaveDays = leaveDays;this.reason = reason;}public String getName() {return name;}public int getLeaveDays() {return LeaveDays;}public String getReason() {return reason;}public void setName(String name) {this.name = name;}public void setLeaveDay(int leaveDays) {LeaveDays = leaveDays;}public void setReason(String reason) {this.reason = reason;}
}
  • 抽象处理器(handler)
/*** 抽象类	责任链对象*/
public abstract class Leader {// 当前责任链对象名称protected String name;//责任链上的后继对象protected Leader nextLeader; public Leader(String name) {super();this.name=name;}/*** 设定责任链上的后继对象* @param nextLeader*/public void setNextLeader(Leader nextLeader) {this.nextLeader = nextLeader;}/*** 处理请求的核心的业务抽象方法* @param request*/public abstract void HandleReques(LeaveRequest request);
}
  • 具体处理器(ConcreteHandler)
/*** 主任*/
public class Director extends Leader{public Director(String name) {super(name);}@Overridepublic void HandleReques(LeaveRequest request) {if(request.getLeaveDays()<3){System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("主任"+this.name+"给予"+request.getName()+"请假审批通过!");}else{if(null!=this.nextLeader){this.nextLeader.HandleReques(request);}}}	
}
/*** 经理*/
public class Manager extends Leader{public Manager(String name) {super(name);}@Overridepublic void HandleReques(LeaveRequest request) {if(request.getLeaveDays()<7){System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("经理"+this.name+"给予"+request.getName()+"请假审批通过!");}else{if(null!=this.nextLeader){this.nextLeader.HandleReques(request);}}}	
}
/*** 总经理*/
public class GeneralManager extends Leader{public GeneralManager(String name) {super(name);}@Overridepublic void HandleReques(LeaveRequest request) {if(request.getLeaveDays()<30){System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());System.out.println("总经理"+this.name+"给予"+request.getName()+"请假审批通过!");}else{System.out.println("此人可能想辞职,审批不通过!");}}	
}
  • 客户端组装成链表结构调用
// 责任链模式 -----不用修改代码  就可以添加相应的子类 
public static void main(String[] args) {Leader a=new Director(":张三,");Leader b=new Manager(":李四,");Leader c=new GeneralManager(":王五,");//责任链上的对象关系a.setNextLeader(b);b.setNextLeader(c);//开始请假操作LeaveRequest req=new LeaveRequest("Tom",8,"相亲");a.HandleReques(req);}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式(10):享元模式
          设计模式(11):适配器模式
          设计模式(12):代理模式
          设计模式(13):模板方法模式
          设计模式(14):命令模式
          设计模式(15):迭代器模式
          设计模式(16):观察者模式
          设计模式(17):中介者模式
          设计模式(18):状态模式
          设计模式(19):策略模式
          设计模式持续更新中…

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

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

相关文章

RK3588开发笔记-spi扩展canfd芯片MCP2518FD调试笔记

目录 前言 一、MCP2518FD 二、原理图连接 三、内核配置

SpringBoot 中的 application.yml 和 bootstrap.yml 的区别

前言 在日常开发当中我们往往会看到在项目中的 resources 文件夹下 有两个文件&#xff0c;1-application.yml、2-bootstrap.yml&#xff0c;第一个我们可能并不陌上&#xff0c;那么第二个配置文件你是否了解呢&#xff1f;为什么要有两个&#xff0c;有什么区别&#xff0c;…

NzN的数据结构--二叉树part2

上一章我们介绍了二叉树入门的一些内容&#xff0c;本章我们就要正式开始学习二叉树的实现方法&#xff0c;先三连后看是好习惯&#xff01;&#xff01;&#xff01; 目录 一、二叉树的顺序结构及实现 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆的创建 …

Idea 通过 Tomcat 启动项目时出现“错误:找不到或无法加载主类 ecoding”

问题描述 在Idea中通过Tomcat启动项目时&#xff0c;出现 “错误&#xff1a;找不到或无法加载主类 ecoding” 原因 在Tomcat - Eidt Configurations....中配置VM options时出现了错误&#xff0c;可以查看下该配置是否填写正确&#xff1b;

2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互

文章目录 1 玩家配置2 物体配置3 添加视觉效果4 添加文字5 其他操作5.1 双面渲染5.2 替换图片 ​ 在开始操作前&#xff0c;我们导入先前配置好的预制体 MyOVRCameraRig&#xff0c;相关介绍在 《2024-04-03 NO.4 Quest3 手势追踪抓取物体-CSDN博客》 文章中。 1 玩家配置 &a…

全自动ai生成视频MoneyPrinterTurbo源码

功能介绍 完整的 MVC架构&#xff0c;代码 结构清晰&#xff0c;易于维护&#xff0c;支持 API 和 Web界面 支持视频文案 AI自动生成&#xff0c;也可以自定义文案支持多种 高清视频 尺寸 竖屏 9:16&#xff0c;1080x1920 横屏 16:9&#xff0c;1920x1080 支持 批量视频生成&am…

PHP基础

搭建环境 网站基本概念 服务器概念 服务器是为电脑提供服务的电脑&#xff0c;本地电脑如果有公网IP&#xff0c;那也能当作服务器工作服务器是计算机的一种&#xff0c;它比普通计算机运行更快&#xff0c;负载更高、价格更贵。 服务器在网络中为其它客户机&#xff08;如P…

借助 Aspose.Words,在 C# 中将图片转换为 Word

Microsoft Word 提供了多种用于生成具有增强的格式化功能的文本文档的工具。除了文本格式之外&#xff0c;我们还可以将各种图形元素和图像合并到Word文档中。在某些情况下&#xff0c;我们可能需要将图片或照片插入DOC或DOCX格式的Word文档中。在本文中&#xff0c;我们将学习…

报错解决:Failed to load config “react-app“ to extend from.

在学习redux时&#xff0c;从官方github上克隆下来的代码运行时报错 Failed to load config “react-app” to extend from. Referenced from: F:\Web\react\redux\.eslintrc.js 查资料发现时&#xff0c;大多数问题在于eslint缺失导致加载失败&#xff0c;于是我们应该在自己要…

DevOps已死?2024年的DevOps将如何发展

随着我们进入2024年&#xff0c;DevOps也发生了变化。新兴的技术、变化的需求和发展的方法正在重新定义有效实施DevOps实践。 IDC预测显示&#xff0c;未来五年&#xff0c;支持DevOps实践的产品市场继续保持健康且快速增长&#xff0c;2022年-2027年的复合年增长率&#xff0…

计算机网络---第二天

计算机网络概述 计算机网络的定义&#xff1a; 定义&#xff1a;是一组自治计算机通过某种传输介质进行的集合。 计算机网络的基本功能&#xff1a; 功能&#xff1a;①负载均衡和分布式处理&#xff1b;②资源共享&#xff1b;③综合信息服务 计算机网络类型&#xff1a;…

【神经网络】卷积神经网络CNN

卷积神经网络 欢迎访问Blog全部目录&#xff01; 文章目录 卷积神经网络1. 神经网络概览2.CNN&#xff08;Convolutional Neunal Network&#xff09;2.1.学习链接2.2.CNN结构2.2.1.基本结构2.2.1.1输入层2.2.1.2.卷积层|Convolution Layers2.2.1.3.池化层|Pooling layers2.3…

k8s部署efk

环境简介&#xff1a; kubernetes: v1.22.2 helm&#xff1a; v3.12.0 elasticsearch&#xff1a; 8.8.0 chart包&#xff1a;19.10.0 fluentd: 1.16.2 chart包&#xff1a; 5.9.4 kibana: 8.2.2 chart包&#xff1a;10.1.9 整体架构图&#xff1a; 一、Elasticsearch安装…

WKWebView的使用

一、简介 在iOS中&#xff0c;WKWebView是WebKit框架提供的一个用于展示网页内容的控件&#xff0c;相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤&#xff1a; 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…

归一化技术比较研究:Batch Norm, Layer Norm, Group Norm

归一化层是深度神经网络体系结构中的关键&#xff0c;在训练过程中确保各层的输入分布一致&#xff0c;这对于高效和稳定的学习至关重要。归一化技术的选择&#xff08;Batch, Layer, GroupNormalization&#xff09;会显著影响训练动态和最终的模型性能。每种技术的相对优势并…

Codeforces Round 938 (Div. 3) A - F 题解

A. Yogurt Sale 题意&#xff1a;要购买n个酸奶&#xff0c;有两种买法&#xff0c;一种是一次买一个&#xff0c;价格a。一种是一次买两个&#xff0c;价格b&#xff0c;问买n个酸奶的最小价格。 题解&#xff1a;很容易想到用2a和b比较&#xff0c;判断输出即可。 代码&am…

Pandas进行数据分析

dataframe添加列&#xff1a;df2.drop(新增加的列:,axis1,inplaceTrue) 在Pandas中&#xff0c;DataFrame的列是Series对象&#xff0c;而Series对象具有一系列字符串处理方法。要对Series中的字符串进行操作&#xff0c;需要使用.str属性来访问这些字符串方法。删除列中的横线…

麻雀优化算法(Sparrow Search Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 麻雀算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种受自然界麻雀群体行为启发的优化算法。想象一下&#xff0c;一…

【MacOs】proxychains配置使用

一、开始 1. 安装proxychains 使用brew进行安装 brew install proxychains-ng没有homebrew的&#xff0c;可以使用该命令安装 /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"2. 配置代理配置文件 cd /opt/homeb…

day5 nest商业项目初探·一(java转ts全栈/3R教室)

背景&#xff1a;从头一点点学起太慢了&#xff0c;直接看几个商业项目吧&#xff0c;看看根据Java的经验&#xff0c;自己能看懂多少&#xff0c;然后再系统学的话也会更有针对性。先看3R教室公开的 kuromi 移民机构官方网站吧 【加拿大 | 1.5w】Nextjs&#xff1a;kuromi 移民…