设计模式篇---职责链模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

职责链模式:避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。

比如大学期间,我们进行奖学金申请,100到1000是导员审批,1000到2000是系主任审批,2000到5000是院长审批。
每一个人审批的内容都是不同的,如果有一个审批者认为不符合自己的审批条件,则将审批流转到下一个人。而我们也只需要和导员提交申请,不需要关注后面的审批人。

结构

在这里插入图片描述
Handler(抽象处理者):它定义了一个处理请求的接口,由于不同的具体处理者处理请求的方式不同,每一个处理者的下家还是一个处理者,故在其定义了一个抽象处理者类型的对象作为下家的引用。
ConcreteHandler(具体处理者):在具体处理者中实现了抽象处理者中的方法,在处理请求之前需要进行判断,看是否具有相应的处理权限,有的话则处理,没有的话则将请求转发给后继者。

实例

某企业的采购系统包含一个审批的子系统,可以根据采购金额不同,由不同层次的主管人员来审批。主任审批5万元以下的,副董事长审批5w到10w的,董事长审批10w到50w的,50w以上的采购需要开董事会来讨论决定。
在这里插入图片描述

采购单类,充当请求类。

@Data
public class PurchaseRequest {// 采购金额private double amount;// 采购单编号private int number;// 采购目的private String request;public PurchaseRequest(double amount, int number, String request) {this.amount = amount;this.number = number;this.request = request;}}

审批者的抽象类

public abstract class Approver {//定义后继对象protected Approver successor;protected String name;public Approver(String name) {this.name = name;}public void setSuccessor(Approver approver){this.successor = approver;}public abstract void processRequest(PurchaseRequest request);}

主任类,充当具体处理者

public class Director extends Approver {public Director(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 50000) {System.out.println("主任:" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");} else {this.successor.processRequest(request);}}
}

副董事长类

public class VicePresident extends Approver {public VicePresident(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 100000) {System.out.println("副董事长:" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");} else {this.successor.processRequest(request);}}
}

董事长类

public class President extends Approver {public President(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {if (request.getAmount() < 500000) {System.out.println("董事长:" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");} else {this.successor.processRequest(request);}}
}

董事会

public class Congress extends Approver{public Congress(String name) {super(name);}@Overridepublic void processRequest(PurchaseRequest request) {System.out.println("召开董事会审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getRequest() + ".");}
}

客户端使用

public class Client {public static void main(String[] args) {Approver director = new Director("张三");Approver vicePresident = new VicePresident("李四");Approver president = new President("王五");Approver congress = new Congress("董事会");director.setSuccessor(vicePresident);vicePresident.setSuccessor(president);president.setSuccessor(congress);PurchaseRequest purchaseRequest1 = new PurchaseRequest(45000, 10001, "购买员工座椅");PurchaseRequest purchaseRequest2 = new PurchaseRequest(60000, 10002, "购买员工电脑");director.processRequest(purchaseRequest1);director.processRequest(purchaseRequest2);}
}

执行结果:
在这里插入图片描述

总结

职责链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递。请求发送者无需知道请求被谁处理,实现了请求发送者和处理者之间的解耦。
使用场景:
1、当多个对象可以处理同一个请求,但每个对象处理的方式、时机不同,可以考虑使用职责链。
2、在不明确指定接受者的情况下向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求,客户端动态的创建职责链来处理请求,还可以改变链中处理者之间的先后顺序。

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

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

相关文章

【MybatisPlus快速入门】(2)SpringBoot整合MybatisPlus 之 标准数据层开发 代码示例

目录 1 标准CRUD使用2 新增3 删除4 修改5 根据ID查询6 查询所有7 MyBatis-Plus CRUD总结 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节中我们重点学习的是数据层标准的CRUD(增删改查)的实现与分页功能。代码比较多&#xff0c;我们一个个来学习…

05_符号表

05_符号表 一、符号表符号表API设计符号表实现有序符号表 一、符号表 符号表最主要的目的就是将一个键和一个值联系起来&#xff0c;符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据&#xff0c;我们可以根据键来查找对应的值。符号表中&#xff0c;键具有唯…

prometheus二进制安装

1、在需要安装prometheus的目录下执行wget命令下载软件到本地&#xff0c;如我的路径是/opt/module/prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz正在解析主机 objects.githubusercontent.com …

4.svn版本管理工具使用

1. 什么是SVN 版本控制 它可以记录每一次文件和目录的修改情况,这样就可以借此将数据恢复到以前的版本,并可以查看数据的更改细节! Subversion(简称SVN)是一个自由开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空 SVN的优势 统一的版本号 Subversi…

婚庆婚礼策划服务网站建设的效果如何

品牌效应越来越重要&#xff0c;婚庆行业在多年的发展下&#xff0c;部分区域内也跑出了头部品牌&#xff0c;连锁门店也开了很多家&#xff0c;无论新品牌还是老品牌在新的区域开店总归少不了线上线下的宣传&#xff0c;虽然几乎每个人都会接触婚庆服务&#xff0c;但因为市场…

【什么是反射机制?为什么反射慢?】

✅ 什么是反射机制&#xff1f;为什么反射慢&#xff1f; ✅典型解析✅拓展知识仓✅反射常见的应用场景✅反射和Class的关系 ✅典型解析 反射机制指的是程序在运行时能够获取自身的信息。在iava中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有…

jmeter性能测试监测性能——linux安装PerfMon Server Agent

前言 这些天有性能压测的任务&#xff0c;Darren洋特意整理了一下使用jmeter来进行性能压测时使用PerfMon Server Agent来进行服务器性能资源监控的步骤。 一、下载PerfMon Server Agent PerfMon Server Agent下载传送带&#xff1a; https://github.com/undera/perfmon-age…

【STM32】I2C通信

基本的任务是&#xff1a;通过通信线&#xff0c;实现单片机读写外挂模块寄存器的功能。其中至少要实现在指定位置写寄存器和在指定的位置读寄存器这两个功能。 异步时序的优点&#xff1a;省一根时钟线&#xff0c;节约资源&#xff1b;缺点&#xff1a;对事件要求严格&#…

python实现元旦多种炫酷高级倒计时_附源码【第19篇—python过元旦】

文章目录 &#x1f30d;python实现元旦倒计时 — 初级(控制台)⛅实现效果&#x1f30b;实现源码&#x1f31c;源码讲解 &#x1f30d;python实现元旦倒计时 — 中级(精美动态图)⛅实现效果&#x1f30b;实现源码&#x1f31c;源码讲解 &#x1f30d;python实现元旦倒计时 — 高…

Fireblock:为Dapp实现可编程隐私

1. 引言 Fireblock network为Cosmos生态应用链。并于2023年10月宣布完成pre-seed轮250万美金融资。 其定位为实现&#xff1a; 有条件解密可编程隐私 Fireblock使用的密码学方案有&#xff1a; distributed key generation&#xff08;DKG&#xff09;Identity-based encry…

Linux网络编程——Socket编程步骤及常用API

Sockt服务器和客户端的开发步骤 TCP connect()最好建立在listen()后&#xff0c;一旦监听到就建立连接。 UDP 常用API 包含头文件 #include<sys/types.h> #include<sys/socket.h>创建套接字&#xff08;连接协议&#xff09; 作用 用于根据指定的地址族、数据…

四、ensp配置ftp服务器实验

文章目录 实验内容实验拓扑操作步骤配置路由器为ftp server 实验内容 本实验模拟企业网络。PC-1为FTP 用户端设备&#xff0c;需要访问FTP Server&#xff0c;从服务器上下载或上传文件。出于安全角度考虑&#xff0c;为防止服务器被病毒文件感染&#xff0c;不允许用户端直接…

SpringBoot集成opencc4j实现繁体中文转为简体中文

背景 繁体中文转为简体中文的需求非常常见&#xff0c;特别是在中文语境下的文本处理和翻译应用中。有很多现成的工具和库可以实现这个功能&#xff0c;比如 OpenCC 、 HanLP 等。从网上下载的 MySQL 版诗词数据库中的诗词数据都是繁体字&#xff0c;这里使用 SpringBoot 集成…

互联网上门洗衣洗鞋小程序优势有哪些?

互联网洗鞋店小程序相较于传统洗鞋方式&#xff0c;具有以下优势&#xff1b; 1. 便捷性&#xff1a;用户只需通过手机即可随时随地下单并查询&#xff0c;省去了许多不必要的时间和精力。学生们无需走出宿舍或校园&#xff0c;就能轻松预约洗鞋并取件。 2. 精准定位&#xff1…

代码随想录刷题题Day21

刷题的第二十一天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day21 任务 ● 216.组合总和III ● 17.电话号码的字母组合 1 组合总和III 216.组合总和III 思路&#xff1a; 在[1,2,3,4,5,6,…

vcomp120.dll缺失怎么解决,vcomp120.dll丢失的详细修复方法分享(总共5种方法)

计算机提示找不到vcomp120.dll&#xff0c;无法继续执行代码的5个解决方法和vcomp120.dll是什么以及vcomp120.dll丢失原因与作用解析 在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到vcomp120.dll&#xff0c;无法继续执行代码”。…

基于Springboot的宠物领养系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的宠物领养系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

嵌入式开发必须学习qt吗?

嵌入式开发必须学习qt吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「 嵌入式的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#…

【Linux】定时任务

定时任务常用crontab来定期执行程序。 crontab 基本语法 crontab [-u user] -l # 列出用户cron任务 crontab [-u user] -e # 编辑用户cron任务 crontab [-u user] -r # 移除用户cron任务cron 表达式 # 分 时 日 月 周 执行命令 minute hour day month week command # 示例…

代码随想录算法训练营 | day60 单调栈 84.柱状图中最大的矩形

刷题 84.柱状图中最大的矩形 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.len…