当前位置: 首页 > news >正文

面试设计模式-责任链模式

一 责任链模式

1.1 概述

在进行请假申请,财务报销申请,需要走部门领导审批,技术总监审批,大领导审批等判断环节。存在请求方和接收方耦合性太强,代码会比较臃肿,不利于扩展和维护。

1.2 责任链模式

针对上面,使用责任链模式,将请求方和接收方的业务进行解耦,客户端发送一个请求,由一个抽象的处理请求的类 Handler 来接受这个请求,而具体怎么处理请求,就由 Handler 的子类来完成处理请求方法的实现,每个子类满足条件则自己处理,不满足调用下一个处理子类进行处理,以此类推,形成一条处理的链条。

1.3 代码实现

1.采购请求类

package com.ljf.day0905;/*** @ClassName: ClientRequest* @Description: TODO* @Author: admin* @Date: 2023/09/05 21:55:41 * @Version: V1.0**/
public class ClientRequest {/* 请求类型 */private int type = 0;/* 请求金额 */private float price = 0.0f;/* 请求编号 */private int id = 0;/*** 全参构造** @param type* @param price* @param id*/public ClientRequest(int type, float price, int id) {this.type = type;this.price = price;this.id = id;}public int getType() {return type;}public float getPrice() {return price;}public int getId() {return id;}}

2.审批抽象类

package com.ljf.day0905;/*** @ClassName: Approver* @Description: TODO* @Author: admin* @Date: 2023/09/05 21:56:49 * @Version: V1.0**/
public abstract class Approver {/* 审批人姓名 */protected String name;/* 下一个审批人 */protected Approver approver;/*** 创建审批人要指定姓名** @param name*/public Approver(String name) {this.name = name;}/*** 指定下一个审批人** @param approver*/public void setApprover(Approver approver) {this.approver = approver;}/*** 抽象的审批方法** @param purchaseRequest*/public abstract void approve(ClientRequest purchaseRequest);}

3.子类来继承抽象审批类

3.1 DeaprtLeader

package com.ljf.day0905;/*** @ClassName: DeaprtLeader* @Description: TODO* @Author: admin* @Date: 2023/09/05 21:58:10 * @Version: V1.0**/
public class DeaprtLeader extends Approver {/*** 创建审批人要指定姓名** @param name*/public DeaprtLeader(String name) {super(name);}/*** 教学主任审批逻辑** @param purchaseRequest*/public void approve(ClientRequest purchaseRequest) {if (purchaseRequest.getPrice() <= 5000) {System.out.println("请求编号:" + purchaseRequest.getId() + "被" +this.name + "处理");} else {approver.approve(purchaseRequest);}}}

2.BossLeader

package com.ljf.day0905;/*** @ClassName: BossLeader* @Description: TODO* @Author: admin* @Date: 2023/09/05 21:59:23 * @Version: V1.0**/
public class BossLeader extends Approver{/*** 创建审批人要指定姓名** @param name*/public BossLeader(String name) {super(name);}/*** 院长审批逻辑** @param purchaseRequest*/public void approve(ClientRequest purchaseRequest) {if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <=10000) {System.out.println("请求编号:" + purchaseRequest.getId() + "被" +this.name + "处理");} else {approver.approve(purchaseRequest);}}}

3.VicePrincipal

package com.ljf.day0905;import com.sun.security.ntlm.Client;/*** @ClassName: VicePrincipal* @Description: TODO* @Author: admin* @Date: 2023/09/05 22:09:25 * @Version: V1.0**/public class VicePrincipal extends Approver {/*** 创建审批人要指定姓名** @param name*/public VicePrincipal(String name) {super(name);}/*** 副校长审批逻辑** @param purchaseRequest*/public void approve(ClientRequest purchaseRequest) {if (purchaseRequest.getPrice() > 10000 ) {System.out.println("请求编号:" + purchaseRequest.getId() + "被" +this.name + "处理");} else {approver.approve(purchaseRequest);}}}

4.测试

package com.ljf.day0905;/*** @ClassName: TestZe* @Description: TODO* @Author: admin* @Date: 2023/09/05 22:00:19 * @Version: V1.0**/
public class TestZe {public static void main(String[] args) {// 创建采购请求ClientRequest purchaseRequest = new ClientRequest(1, 33310000, 1);
// 创建审批人Approver departmentApprover = new DeaprtLeader("团主任");Approver dean = new BossLeader("方院长");Approver vicePrincipal = new VicePrincipal("磊副校长");// Approver principal = new Principal("喜校长");
// 设置下一个审批人departmentApprover.setApprover(dean);
// 这里要形成一个环链,避免如果 30000 金额以下的请求
// 直接交给校长处理,会出现空指针
// 当然,如果程序规定只能从主任开始处理
// 一层一层最后到校长处理,形成一个单链,这里就不用了设置了dean.setApprover(vicePrincipal);vicePrincipal.setApprover(departmentApprover);// principal.setApprover(departmentApprover);
// 测试:入口departmentApprover.approve(purchaseRequest);}
}

5.结果

责任链模式(Chain of Responsibility Pattern)_Myovlmx的博客-CSDN博客 

相关文章:

面试设计模式-责任链模式

一 责任链模式 1.1 概述 在进行请假申请&#xff0c;财务报销申请&#xff0c;需要走部门领导审批&#xff0c;技术总监审批&#xff0c;大领导审批等判断环节。存在请求方和接收方耦合性太强&#xff0c;代码会比较臃肿&#xff0c;不利于扩展和维护。 1.2 责任链模式 针对…...

Qt 开发 CMake工程

Qt 入门实战教程&#xff08;目录&#xff09; 为何要写这篇文章 目前CMake作为C/C工程的构建方式在开源社区已经成为主流。 企业中也是能用CMake的尽量在用。 Windows 环境下的VC工程都是能不用就不用。 但是&#xff0c;这个过程是非常缓慢的&#xff0c;所以&#xff0…...

2.k8s账号密码登录设置

文章目录 前言一、启动脚本二、配置账号密码登录2.1.在hadoop1&#xff0c;也就是集群主节点2.2.在master的apiserver启动文件添加一行配置2.3 绑定admin2.4 修改recommended.yaml2.5 重启dashboard2.6 登录dashboard 总结 前言 前面已经搭建好了k8s集群&#xff0c;现在设置下…...

【代表团坐车】Python 实现-附ChatGPT解析

1.题目 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1.一个团只能上一辆车,并且代表团人数(代表团数量小于30,每人代表团人数小于30)小于汽车容量…...

【Java】x-easypdf: 一种简单易用的PDF处理库

引言 在处理和生成PDF文档时&#xff0c;有许多库可供选择。其中&#xff0c;x-easypdf是一种简单易用的PDF处理库&#xff0c;可以帮助开发人员轻松地创建、编辑和操作PDF文档。本文将介绍x-easypdf的基本概念、安装方法、主要功能以及使用示例。 安装x-easypdf 要使用x-ea…...

1 Linux输入子系统

1 Linux输入子系统 https://www.cnblogs.com/beijiqie1104/p/11418082.html Linux input 子系统详解 https://www.cnblogs.com/yikoulinux/p/15208238.html...

Zabbix 利用 Grafana 进行图形展示

安装grafana和插件 配置zabbix数据源 导入模版 查看数据 1.安装grafana wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/Packages/grafana-10.0.0-1.x86_64.rpm [rootrocky8 apps]# yum install grafana-10.0.0-1.x86_64.rpm [rootrocky8 apps]# systemctl sta…...

【LeetCode周赛】LeetCode第362场周赛

LeetCode第362场周赛 与车相交的点判断能否在给定时间到达单元格将石头分散到网格图的最少移动次数 与车相交的点 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i…...

Leetcode128. 最长连续序列

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 题解&#…...

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群&#xff08;1&#xff09;初始化&#xff08;2&#xff09;部署网络插件flannel&#xff08;3&#xff09;创建 pod 资源 5.部署 …...

MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 论文阅读

论文信息 题目&#xff1a;MaskVO: Self-Supervised Visual Odometry with a Learnable Dynamic Mask 作者&#xff1a;Weihao Xuan, Ruijie Ren, Siyuan Wu, Changhao Chen 时间&#xff1a;2022 来源&#xff1a; IEEE/SICE International Symposium on System Integration …...

面试求职-面试注意事项

面试技巧和注意事项有哪些&#xff1f; 面试是找工作过程中最重要的一个环节&#xff0c;因为面试成功&#xff0c;你才有可能得到一份工作。求职面试技巧有哪些呢?首先&#xff0c;我们来看看面试注意事项。 企业了解 1、面试前有没有仔细了解过对应企业的情况&#xff0c…...

sm2 签名验签

目前发现 sm2 有很多实现&#xff0c;比如 gmssl, openssl 1.1.1 ,openssl 3.0&#xff0c;各种代码库实现等等。实践中发现这些实现会出现不能互相验签的情况。后续研究一下。 网上的一些资料&#xff0c;给出了一些 openssl 指令&#xff0c;但是没有标明 openssl 的版本&…...

如何检查Windows 11笔记本电脑电池健康状况

如果你拥有一台运行微软最新操作系统的便携式电脑&#xff0c;那么检查Windows 11笔记本电脑的电池健康状况可能很重要。 电池寿命显然是一件大事&#xff0c;无论你是在最好的商务笔记本电脑上工作&#xff0c;还是在目前市场上最好的游戏笔记本电脑上享受马拉松式的Starfiel…...

编程大师-分布式

分布式锁 mysql redis 【IT老齐122】不只setnx&#xff0c;两张图说清Redisson的Redis分布式锁实现_哔哩哔哩_bilibili zk 用这种方式去实现&#xff0c;zookeeper分布式锁&#xff0c;你会吗&#xff1f;_哔哩哔哩_bilibili...

内网隧道代理技术(二十三)之 DNS隧道反弹Shell

DNS隧道反弹Shell DNS隧道 DNS协议是一种请求、应答协议,也是一种可用于应用层的隧道技术。DNS隧道的工作原理很简单,在进行DNS查询时,如果查询的域名不在DNS服务器本机缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议…...

如何利用Socks5代理IP提升网络安全与跨境电商业务

在今天的数字时代&#xff0c;网络安全对于个人和企业来说都至关重要。随着跨境电商和在线游戏等业务的不断发展&#xff0c;保护网络安全变得尤为重要。Socks5代理IP是一项强大的工具&#xff0c;可以帮助您实现更高水平的网络安全&#xff0c;同时促进跨境电商和游戏领域的增…...

信号量(Semaphore)

信号量(Semaphore)是一种经典的多线程同步工具,用于控制多个线程对共享资源的访问。信号量维护了一个计数器,表示可用的资源数量,线程可以通过信号量来请求资源并释放资源。信号量的主要操作包括获取(acquire)资源和释放(release)资源。 Java 中的信号量通常有两种类…...

<el-input-number>显示两位数字;如果是一位数字的话前面补0

可以通过自定义 formatter 函数来实现。具体步骤如下&#xff1a; 在 <el-input-number> 上添加 :formatter 属性&#xff0c;值为 formatter 函数名。 在 methods 中定义 formatter 函数&#xff0c;该函数接收一个参数 value&#xff0c;表示当前输入框中的值。 在 f…...

基于SSM的鲜花商城系统【附源码文档】

基于SSM的鲜花商城系统【附源码文档】 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员 用户&#xff1a;登录、注册、商品查询、公告预…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...