职责链设计模式

news2024/11/17 23:44:38

职责链模式又叫命令链、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);
    }

    @Override
    public 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);
    }

    @Override
    public 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);
    }

    @Override
    public 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.coloradmin.cn/o/972353.html

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

相关文章

基于Vgg-Unet模型自动驾驶场景检测

1.VGG VGG全称是Visual Geometry Group属于牛津大学科学工程系&#xff0c;其发布了一些列以VGG开头的卷积网络模型&#xff0c;可以应用在人脸识别、图像分类等方面,VGG的输入被设置为大小为224x244的RGB图像。为训练集图像上的所有图像计算平均RGB值&#xff0c;然后将该图像…

vscode上搭建go开发环境

前言 Go语言介绍&#xff1a; Go语言适合用于开发各种类型的应用程序&#xff0c;包括网络应用、分布式系统、云计算、大数据处理等。由于Go语言具有高效的并发处理能力和内置的网络库&#xff0c;它特别适合构建高并发、高性能的服务器端应用。以下是一些常见的Go语言应用开发…

静态路由配置出错记录

根据实验手册&#xff0c;配置静态路由&#xff0c;但是怎么也排除不了错误。 最后发现&#xff0c;是自己的默认网关配置错误了。但是使用模拟器抓包看到的&#xff0c;也没有提示网关信息啊。

docker desktop如何一键进入容器内部

对着对应的容器 点击 view files

电压互感器倍频感应耐压试验注意事项

注意事项 被试 PT 在三倍频耐压时呈容性&#xff0c; 对于 110kV、 220kV 互感器进行感应耐压试验时&#xff0c;应在开口 a D x D 端子间励磁&#xff0c; 可在 PT 二次绕组 ax 上接补偿电感&#xff0c; 对于 35kV 电压互感器励磁电压一般加至二次 a—x 间&#xff1b;三倍频…

测开之 Python 自动化全栈工程师 + 性能专项

功能测试基础 接口测试基础 接口的通信原理与本质 cookie、session、token 详解 接口测试的意义与测试方法 接口测试用例的设计 app 测试 app 流程测试 app 兼容性测试 app 稳定性测试 app 性能专项测试 app 抓包 UI 功能测试基础 常见功能测试方法&#xff1a;等价类&…

JVM | 垃圾回收器(GC)- Java内存管理的守护者

引言 在编程世界中&#xff0c;有效的内存管理是至关重要的。这不仅确保了应用程序的稳定运行&#xff0c;还可以大大提高性能和响应速度。作为世界上最受欢迎的编程语言之一&#xff0c;通过Java虚拟机内部的垃圾回收器组件来自动管理内存&#xff0c;是成为之一的其中一项必…

极米RS Pro 3投影参数是多少?极米投影仪RS Pro 3好用吗?

近年来&#xff0c;随着投影技术的快速发展&#xff0c;越来越多的用户开始选择投影产品来打造家庭影院&#xff0c;为生活带来新的观影体验。但要想打造一个家庭影院&#xff0c;选到一台合适的投影仪却并不是一件容易的事&#xff0c;因为家庭影院对画面的亮度、色彩和观影舒…

(18)线程的实例认识:线程的控制,暂停,继续,停止,线程相互控制,协作

一、老方式 1、这是一个老的实现方式&#xff0c;基本不推荐&#xff0c;背后控制的原理需要了解。 界面&#xff1a;三个button一个textbox 代码&#xff1a; private volatile bool isPause false;//fprivate void BtnStart_Click(object…

力扣|两数相加

先放题目&#xff1a; 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c…

敏捷开发方法:快速响应需求变化的开发流程

在快速变化的技术和市场环境下&#xff0c;传统的软件开发方法可能显得笨重和不灵活。敏捷开发方法应运而生&#xff0c;以其快速响应需求变化、持续交付和团队协作的特点&#xff0c;成为现代软件开发的重要方法之一。本文将深入探讨敏捷开发方法的概念、原则、流程以及在实际…

《王道24数据结构》课后应用题——第三章 栈和队列

第三章 【3.1】 03、 假设以I和O分别表示入栈和出操作。栈的初态和终态均为空&#xff0c;入栈和出栈的操作序列可表示为仅由I和O组成的序列&#xff0c;可以操作的序列称为合法序列&#xff0c;否则称为非法序列。 如IOIIOIOO 和IIIOOIOO是合法的&#xff0c;而IOOIOIIO和II…

maven基础学习

什么是maven 构建 依赖 maven核心概念坐标 在黑窗口使用maven命令生成maven工程 pom.xml 想导入哪个jar包把它的坐标放到dependency里就可以 maven核心概念POM maven核心概念约定的目录结构 执行maven的构建命令 清理操作&#xff0c;clean 编译操作 compile 测试操作 test 打包…

ElasticSearch进阶

一、 search检索文档 ES支持两种基本方式检索&#xff1b; 通过REST request uri 发送搜索参数 &#xff08;uri 检索参数&#xff09;&#xff1b;通过REST request body 来发送它们&#xff08;uri请求体&#xff09;&#xff1b; 1、信息检索 API&#xff1a; https://w…

Mybatis的关联关系配置一对一,一对多,多对多的映射关系

目录 关联关系映射 一对一关联&#xff1a; 一对多关联&#xff1a; 多对多关联&#xff1a; 导入数据库表 一对多 一对一 多对多 关联关系映射 关联关系映射在Mybatis中主要通过三种方式实现&#xff1a;一对一关联和一对多关联及多对多关联。 一对一关联&#xff1a;…

算法 数据结构 双向环形链表 手撸环形链表 环形链表实现容器 环形链表添加修改删除获取大小 环形链表实现自定义容器 手撸容器 双向环形哨兵链表 算法(六)

1. 环形链表&#xff1a; 2. 建议先不要看我写得自己先实现下&#xff0c;只将Node内部类复制自己命名得容器内&#xff0c; 实现方法&#xff1a; a. add方法&#xff08;添加到头部&#xff0c;尾部添加&#xff0c;指定位置添加&#xff09; b. get方法&#xff08;获取首部…

OpenCV(二十):图像卷积

1.图像卷积原理 图像卷积是一种在图像上应用卷积核的操作。卷积核是一个小的窗口矩阵&#xff0c;它通过在图像上滑动并与图像的像素进行逐元素相乘&#xff0c;然后求和来计算新图像中每个像素的值。通过滑动卷积核并在图像上进行逐像素运算&#xff0c;可以实现一系列图像处理…

Laravel 模型的关联查询 Debugbar 调试器 模型的预加载 ⑩②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

2023高教社杯数学建模A题B题C题D题E题思路模型 国赛建模思路分享

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Re45:读论文 GPT-1 Improving Language Understanding by Generative Pre-Training

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Improving Language Understanding by Generative Pre-Training 论文下载地址&#xff1a;https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 本文是2018年OpenAI的工作&#xff0c…