职责链设计模式

职责链模式又叫命令链、CoR、Chain of Command、Chain of Responsibility。

该模式允许你将请求沿着处理者链进行发送,使多个对象都可以处理请求,每个对象有权决定处理或传递给下个节点。
在这里插入图片描述
客户端:用来定义职责链条。
处理者:声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。
具体处理类:处理请求的实际代码,决定是否处理以及向下传递。

接下来阐述下,职责链模式的各级构成,既然是响应请求,首先得有请求。这里以一个采购审批为例子。

1.请求体

请求者类(普通类):包含两个属性(编号:id 和价格:price)

public class Request {//请求编号private int id;//请求价格private float price;/*** @param id* @param price*/public Request(int id, float price) {super();this.id = id;this.price = price;}public int getId() {return id;}public float getPrice() {return price;}
}

2.抽象处理类

责任链的抽象处理类,顶层接口只生命,不做具体实现。

/*** 类描述:责任链之抽象处理类** @ClassName Handler* @Author ward* @Date 2023-09-01 18:26*/
public abstract class Handler {//创建实现对象,主要用于被定义protected Handler successor;//处理者的名称String name;/*** @param name* 构造器,传入名称即可*/public Handler(String name) {super();this.name = name;}public void setSuccessor(Handler successor) {this.successor = successor;}//业务处理方法,抽象的public abstract void process(ProcureRequest procureRequest);
}

3.具体业务处理类

主任处理类

/*** 类描述:主任处理类** @ClassName DirectorHandler* @Author ward* @Date 2023-09-02 10:54*/
public class DirectorHandler extends Handler {private static final float PRICE = 10000f;/*** @param name 构造器,传入名称即可*/public DirectorHandler(String name) {super(name);}@Overridepublic void process(ProcureRequest procureRequest) {//如果金额小于等于10000,由学校主任审批if (procureRequest.getPrice() <= PRICE) {System.out.println("请求编号: " + procureRequest.getId() + "被" + name + "处理");} else {System.out.println("请求编号: " + procureRequest.getId() + "," + name + "已签字");successor.process(procureRequest);}}
}

财务处理类

/*** 类描述:财务处理类** @ClassName FinanceHandler* @Author ward* @Date 2023-09-02 10:38*/
public class FinanceHandler extends Handler {private static final float PRICE_1 = 10000f;private static final float PRICE_2 = 20000f;private static final String name = "财务";public FinanceHandler(String name) {super(name);}@Overridepublic void process(ProcureRequest procureRequest) {//如果金额大于10000,小于20000,由学校财务审批if (procureRequest.getPrice() > PRICE_1 && procureRequest.getPrice() <= PRICE_2) {System.out.println("请求编号: " + procureRequest.getId() + "被" + name + "处理");} else {System.out.println("请求编号: " + procureRequest.getId() + "," + name + "已签字");successor.process(procureRequest);}}
}

校长处理类

/*** 类描述:校长处理类** @ClassName SchoolMasterHandler* @Author ward* @Date 2023-09-02 10:56*/
public class SchoolMasterHandler extends Handler {private static final float PRICE = 20000f;private static final String name = "校长";/*** @param name 构造器,传入名称即可*/public SchoolMasterHandler(String name) {super(name);}@Overridepublic void process(ProcureRequest procureRequest) {//如果金额大于20000,由学校校长审批if (procureRequest.getPrice() > PRICE) {System.out.println("请求编号: " + procureRequest.getId() + "被" + name + "处理");} else {System.out.println("请求编号: " + procureRequest.getId() + "," + name + "已签字");successor.process(procureRequest);}}
}

4.客户端

这里就是关于创建完实际处理类之后我们如何去把链条建立起来,其实这个一般是封装起来的,然后。

/*** 类描述:客户端** @ClassName Client* @Author ward* @Date 2023-09-02 11:06*/
public class Client {public static void testChain(int id, int price) {//创建请求对象ProcureRequest procureRequest = new ProcureRequest(id, price);//创建各个处理者Handler directorHandler = new DirectorHandler("学校主任");Handler financeHandler = new FinanceHandler("学校财务");Handler schoolMasterHandler = new SchoolMasterHandler("学校校长");//设置链条下一级directorHandler.setSuccessor(financeHandler);financeHandler.setSuccessor(schoolMasterHandler);//开始处理directorHandler.process(procureRequest);}public static void main(String[] args) {int[] priceArr = {500, 10001, 20001};int id = 1;for (int price : priceArr) {testChain(id, price);id++;}}}

在这里插入图片描述

5.子标题

正文

在这里插入代码片

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

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

相关文章

OpenCV 07(图像滤波器)

一、卷积 什么是图片卷积? 图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程 步长 步长就是卷积核在图像上移动的步幅. 上面例子中卷积核每次移动一个像素步长的结果, 如果将这个步长修改为2, 结果会如何? 为了充分扫描图片, 步长一般设为1. padding …

更换 yum 阿里源 - 手把手教你怎么配置,在也不需要求别人了 - 看懂一个就相当于看懂了其他的linux系统

更换阿里源 我的是centos8 当然 centos7 也可以换 后面有更详细的怎么配 &#xff0c;再也不用求别人怎么弄了 最直接的方式 直接复制 执行 centos7 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo或者 wget -O /etc/yum.repos.…

fastadmin 框架中图片点击放大

fastadmin的原生图片预览,重新打开一个窗口太麻烦&#xff0c;使用layui做一个弹窗式的图片预览 效果如下&#xff1a; 点击放大&#xff1a; 第一步&#xff1a;在backend-init.js文件中添加如下代码&#xff1a; $(body).on(click, [data-tips-image], function () {var…

Java进行多线程编程?(lambda表达式~)

本文标题&#xff1a;Java进行多线程编程&#xff1f;那么&#xff0c;Java为啥不学学如何进程多进程编程呢&#xff1f;&#xff1f;原因在于&#xff1a;Java圈子中不提倡多进程编程~~ 接下来&#xff0c;我们来写一个最为基础/入门的HelloWord程序来感受如何进行多线程~~ J…

leetcode:58. 最后一个单词的长度

题目&#xff1a; 函数原型&#xff1a; int lengthOfLastWord(char * s) 解析&#xff1a; 求最后一个单词的长度&#xff0c;我们有两种思路 第一种思路&#xff1a; 逆向求&#xff0c;先设置一个字符串下标index&#xff0c;定位到最后一个单词的最后一个字符。再一个设置长…

微服务-kubernetes安装

文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性&#xff1a;2.2.2、传统部署方式&#xff1a;2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…

Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取

mybatis的自动识别参数功能很强大&#xff0c;pojo实体类可以直接写进mapper接口里面&#xff0c;不需要在mapper.xml文件中添加paramType,但是加了可以提高mybatis的效率 不加Param注解&#xff0c;取值的时候直接写属性 //这里是单参数&#xff0c;可以不加param&#xff01…

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)

Node.js 操作百度网盘实现文件上传&#xff08;小文件上传&#xff0c;大文件分片上传&#xff09; 前提准备&#xff1a;获取百度网盘的授权码 https://pan.baidu.com/union/doc/al0rwqzzl const fs require(fs); const crypto require(crypto); const path require(pat…

扫地僧万能HTML模板站群:打造高效便捷的网站建设利器

扫地僧万能HTML模板站群是一款功能强大的网站建设工具&#xff0c;以其独特的特点和卓越的性能在网络开发领域广受赞誉。本文将介绍扫地僧万能HTML模板站群的几大特点&#xff0c;包括模板自动处理、一站管理、泛站独立、多套模板、蜘蛛统计、超强自定义、超强负载、简单高效、…

Achronix与您相约“2023全球AI芯片峰会”

2023全球AI芯片峰会&#xff08;GACS 2023&#xff09;将于9月14-15日在深圳市深圳湾万丽酒店举行。峰会由智一科技旗下芯东西联合智猩猩&#xff08;智东西公开课全新品牌&#xff09;联合发起主办&#xff0c;以「AI大时代 逐鹿芯世界」为主题。 届时&#xff0c;Achronix将…

【docker快速部署微服务若依管理系统(RuoYi-Cloud)】

工作原因&#xff0c;需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合&#xff0c;它有足够多的中间件&#xff0c;而且官方提供docker安装&#xff0c;但我本人在安装过程中遇到了很多坑&#xff0c;在这里记录一下防止下次会再次遇到。 项目地址 ht…

表单引擎的自定义控件的概念与设计

基本概念 概述 控件的定义&#xff1a;用于展示或者采集数据的表单元素&#xff0c;称为控件,比如&#xff1a;文本框、下拉框、单选按钮、从表等.自定义控件&#xff1a;表单引擎提供的基础控件之外的控件称为自定义控件, 这些控件由开发人员自己定义&#xff0c;比如&#…

导入jdk源码并进行使用

jdk下载地址 JDK1.8源码下载地址 idea打开jdk项目 打开项目结构&#xff0c;进入SDK这一栏&#xff0c;选择一个使用的jdk&#xff0c;选择jdk的类路径 将类路径进行删除&#xff0c;并且添加我们自己下载的jdk中的src文件夹到类路径

Nodejs+vue+mysql网上药店购药系统 9h2k5

本毕业设计的内容是设计并且实现一个基于vue.js框架的空巢老人购药系统。采用MYSQL为数据库开发平台&#xff0c;nodejs语言&#xff0c;网络信息服务作为应用服务器。空巢老人购药系统的功能已基本实现&#xff0c;主要用户、家属、养生知识、药品信息、身体信息等。 论文主要…

海外ASO优化之如何优化游戏应用

如果我们发布了一款手机游戏或者管理了一款手机游戏&#xff0c;那么需要确保我们的手机游戏对合适的人可见&#xff0c;目的是增加应用的下载量。 1、优化游戏元数据的关键词。 Apple和Google在应用商店中为我们提供有限的空间&#xff0c;来描述手机游戏及其优势。我们需要使…

安防监控/视频汇聚/云存储/AI视频智能算法引擎系统:遛狗检测算法详解

根据最新修订发布的《中华人民共和国动物防疫法》规定&#xff1a;遛狗不栓绳&#xff0c;养狗不办证、未定期接种疫苗等行为都是违法行为。作为一个合格的“铲屎官"出门遛狗一定要牵好狗绳&#xff0c;保护他人和爱犬的安全。但就算法律明文规定&#xff0c;还是有很多人…

Android SDK 上手指南||第十一章 虚拟与物理设备

第十一章 虚拟与物理设备 在之前的文章里&#xff0c;大家已经了解了Android项目当中的基本元素、接触了用户界面的设计以及数据存储方案。接下来&#xff0c;我们将一同探索如何在物理及虚拟设备上运行自己的应用程序并与之互动。在系列文章的下一篇中&#xff0c;我们将分步…

SQL函数

函数 字符串函数数值函数日期函数流程函数 字符串函数 常用函数&#xff1a; 函数功能CONCAT(s1, s2, …, sn)字符串拼接&#xff0c;将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充&#xff0c;用…

【Unity3D赛车游戏优化篇】新【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【自动化测试】之PO模式介绍及案例

目录 概念 PO三层模式&#xff1a; 1. 构建基础的 BasePage 对象层 2. 构建首页的 Page 层&#xff08;操作层&#xff09; 3.构建业务层 常用断言方法&#xff1a; 4. 构建用例集&#xff0c;执行文件&#xff0c;输出自动化测试报告 测试报告模板 概念 PO&#xff08…