职责链设计模式

职责链模式又叫命令链、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.hqwc.cn/news/97685.html

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

相关文章

Elasticsearch 中的向量搜索:设计背后的基本原理

作者&#xff1a;ADRIEN GRAND 实现向量数据库有不同的方法&#xff0c;它们有不同的权衡。 在本博客中&#xff0c;你将详细了解如何将向量搜索集成到 Elastisearch 中以及我们所做的权衡。 你有兴趣了解 Elasticsearch 用于向量搜索的特性以及设计是什么样子吗&#xff1f; …

页面页脚部分CSS分享

先看效果&#xff1a; CSS部分&#xff1a;&#xff08;查看更多&#xff09; <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…

网络版五子棋C++实现

目录 1.项目介绍 2.开发环境 3.核心技术 4.环境搭建 5.WebSocketpp介绍 5.1WebSocketpp是什么 5.2为什么使用WebSocketpp 5.3原理解析&#xff1a; 5.4WebSocketpp主要特性 6.WebSocketpp使用 7.JsonCpp使用 8.MySQL API 9.项目模块设计以及流程图 10.封装日志宏…

redis 数据结构(二)

整数集合 整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不时&#xff0c;就会使用整数集这个数据结构作为底层实现。 整数集合结构设计 整数集合本质上是一块连续内存空间&#xff0c;它的结构定义如下&#xff1a; typed…

AJAX学习笔记3练习

AJAX学习笔记2发送Post请求_biubiubiu0706的博客-CSDN博客 1.验证用户名是否可用 需求,用户输入用户名,失去焦点-->onblur失去焦点事件,发送AJAX POST请求,验证用户名是否可用 新建表 前端页面 WEB-INF下新建lib包引入依赖,要用JDBC 后端代码 package com.web;import jav…

​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​

C自学精简教程 目录(必读) 作业目标&#xff1a; 这个作业中&#xff0c;你需要综合运用之前文章中的知识&#xff0c;来解决一个相对完整的应用程序。 作业描述&#xff1a; 1 在这个作业中你需要在文本文件中存储学生通讯录的信息&#xff0c;并在程序启动的时候加载这些…

RHCA之路---EX280(6)

RHCA之路—EX280(6) 1. 题目 Create an application greeter in the project samples which uses the Docker image registry.lab.example.com/openshift/hello-openshift so that it is reachable at the following address only: https://greeter.apps.lab.example.com (Not…

目标检测框架MMDetection训练自定义数据集实验记录

在上一篇博文中&#xff0c;博主完成了MMDetection框架的环境部署与推理过程&#xff0c;下面进行该框架的训练过程&#xff0c;训练的入口文件为tools/train.py&#xff0c;我们需要配置的内容如下&#xff1a; parser.add_argument(--config,default"/home/ubuntu/prog…

ApiPost7使用介绍 | HTTP Websocket

一、基本介绍 创建项目&#xff08;团队下面可以创建多个项目节点&#xff0c;每个项目可以创建多个接口&#xff09;&#xff1a; 参数描述库&#xff08;填写参数时自动填充描述&#xff09;&#xff1a; 新建环境&#xff08;前置URL、环境变量很有用&#xff09;&#x…

建筑结构健康监测系统:智能监测建筑结构健康状况

大型公共建筑因其投资大、结构形式复杂、建设工期长、施工工艺复杂、使用年限长等特点。在使用期间受超常荷载、材料老化、构件缺陷等因素的作用&#xff0c;结构将逐渐产生损伤累积&#xff0c;从而使结构的承载能力降低&#xff0c;抵抗自然灾害的能力下降。如遇地震、台风等…

TiDB x 安能物流丨打造一栈式物流数据平台

作者&#xff1a;李家林 安能物流数据库团队负责人 本文以安能物流作为案例&#xff0c;探讨了在数字化转型中&#xff0c;企业如何利用 TiDB 分布式数据库来应对复杂的业务需求和挑战。 安能物流作为中国领先的综合型物流集团&#xff0c;需要应对大规模的业务流程&#xff…

定时任务job (现成直接用)

1. 任务调度的2种方式 1. bean调用示例: 对应的类上加Component或Service注解, 类名.方法名(ryTask.ryNoParams) 类名首字母小写; 该类必须要在com.ruoyi 包下, 因为有校验 2. 权限类名调用示例: com.ruoyi.quartz.task.RyTask.ryNoParams 注意: class(类名)调用的时候, 只能调…