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

news2024/11/25 9:38:20

一 责任链模式

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博客 

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

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

相关文章

uboot命令解析流程

uboot命令解析: (1)bootdelay没有打断,跑的是autoboot_command abortboot —>run_command_list (bootcmd) (2)否则走的cli_loop cli_loop –>cli_simple_loop ----> cli_readline —>run_command_repeatable -----> &#xff08;解析命令 匹配命令 运行命令 ) …

lv3 嵌入式开发-8 linux shell脚本函数

目录 1 函数的定义 2 函数的调用 3 变量的作用域 4 练习 1 函数的定义 基本语法&#xff1a; function name() {statements[return value] }function是 Shell 中的关键字&#xff0c;专门用来定义函数&#xff1b; name是函数名&#xff1b; statements是函数要执行…

java八股文面试[数据库]——自适应哈希索引

自适应Hash索引&#xff08;Adatptive Hash Index&#xff0c;内部简称AHI&#xff09;是InnoDB的三大特性之一&#xff0c;还有两个是 Buffer Pool简称BP、双写缓冲区&#xff08;Doublewrite Buffer&#xff09;。 1、自适应即我们不需要自己处理&#xff0c;当InnoDB引擎根…

FOXBORO FBM232 P0926GW 自动化控制模块

Foxboro FBM232 P0926GW 是 Foxboro&#xff08;福克斯博罗&#xff09;自动化控制系统的一部分&#xff0c;通常用于监测和控制工业过程。以下是关于这种类型的自动化控制模块可能具有的一些常见功能&#xff1a; 数字输入通道&#xff1a; FBM232 P0926GW 控制模块通常具有多…

2、在Windows 10中安装和配置 PostgreSQL 15.4

一、PostgreSQL 安装前简介 PostgreSQL&#xff08;通常简称为PG SQL&#xff09;是一个强大、开源的关系型数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它具有广泛的功能和可扩展性&#xff0c;被广泛用于企业和开发项目中,PostgreSQL 具有如下一些关键特点&…

VUE3+TS项目无法找到模块“../version/version.js”的声明文件

问题描述 在导入 ../version/version.js 文件时&#xff0c;提示无法找到模块 解决方法 将version.js改为version.ts可以正常导入 注意&#xff0c;因为version.js是我自己写的模块&#xff0c;我可以直接该没有关系&#xff0c;但是如果是引入的其他的第三方包&#xff0c…

Windows系统的桌面显示信息工具___BGInfo使用

一、BGInfo简介 BGInfo(桌面显示信息工具)是微软开发的用于在Windows系统中实现将Windows系统信息【如:当前用户名、CPU、操作系统版本、IP地址、硬盘等】或自定的内容显示在桌面壁纸上的操作工具,用户可以根据自己的需要定制属于自己的桌面内容(特别是对应企业来说通过域…

原理之Thread与Runnable的关系

原理之Thread与Runnable的关系 附录 课程 附录 1.Thread和Runnable的关系

深入实现 MyBatis 底层机制的任务阶段4 - 开发 Mapper 接口和 Mapper.xml

&#x1f600;前言 在我们的自定义 MyBatis 底层机制实现过程中&#xff0c;我们已经深入研究了多个任务阶段&#xff0c;包括配置文件的读取、数据库连接的建立、执行器的编写&#xff0c;以及 SqlSession 的封装。每个任务阶段都为我们揭示了 MyBatis 内部工作原理的一部分&a…

机器学习算法基础--批量随机梯度下降法回归法

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ 本节算法是梯度下降方法的小批量随机梯度下降法,算法的思路是从数中随机取出n个数据进行数梯度下降,再进行相应的迭代, 最后能够获得一个效果不错的回归方程/最优解. 算法的公式就不…

lv3 嵌入式开发-9 linux TFTP服务器搭建及使用

目录 1 TFTP服务器的介绍 2 TFTP文件传输的特点 3 TFTP服务器的适用场景 4 配置介绍 4.1 配置步骤 4.2 使用 5 常见错误 1 TFTP服务器的介绍 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;即简单文件传输协议 是TCP/IP协议族中的一个用来在客户机与服务器…

9.3.3网络原理(网络层IP)

一.报文: 1.4位版本号:IPv4和IPv6(其它可能是实验室版本). 2.4位首部长度:和TCP一样,可变长,带选项,单位是4字节. 3.8位服务类型 4.16位总长度:IP报头 IP载荷 传输层是不知道载荷长度的,需要网络层来计算. IP报文 - IP报头 IP载荷 TCP报文 TCP载荷 IP载荷(TCP报文) …

解决方案|电子签加速证券业“数字革命”

电子签在各行各业中的快速普及已成为近年来的新趋势。与此同时&#xff0c;电子签也在证券行业中掀起一场数字化转型的新“革命”。 2020年10月&#xff0c; 中基协《私募投资基金电子合同业务管理办法&#xff08;试行&#xff09;&#xff08;征求意见稿&#xff09;》明确了…

《代码随想录》刷题笔记——链表篇【java实现】

链表节点定义 public class ListNode {// 结点的值int val;// 下一个结点ListNode next;// 节点的构造函数(无参)public ListNode() {}// 节点的构造函数(有一个参数)public ListNode(int val) {this.val val;}// 节点的构造函数(有两个参数)public ListNode(int val, ListNo…

【80天学习完《深入理解计算机系统》】第十四天 复习第三章

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

层次分析法(matlab实现)

1.层次分析法&#xff08;AHP&#xff09; 在决策理论中&#xff0c;层次分析法是一种以数学和心理学为基础&#xff0c;组织和分析复杂决策的结构化技术&#xff0c;它代表了一种量化决策标准权重的准确方法&#xff0c;通过成对比较&#xff0c;利用个别专家的经验来估计因素…

MySQL5.7慢查询实践

总结 获取慢查询SQL 已经执行完的SQL&#xff0c;检查慢查询日志&#xff0c;日志中有执行慢的SQL正在执行中的SQL&#xff0c;show proccesslist;&#xff0c;结果中有执行慢的SQL 慢查询日志关键参数 名称解释Query_time查询消耗时间Time慢查询发生时间 分析慢查询SQL e…

【LeetCode算法系列题解】第56~60题

CONTENTS LeetCode 56. 合并区间&#xff08;中等&#xff09;LeetCode 57. 插入区间&#xff08;中等&#xff09;LeetCode 58. 最后一个单词的长度&#xff08;简单&#xff09;LeetCode 59. 螺旋矩阵 II&#xff08;中等&#xff09;LeetCode 60. 第k个排列&#xff08;困难…

ARM DIY(八)USB 调试

前言 V3s 带有一个 USB 接口&#xff0c;将其设置为 HOST 或 OTG 模式&#xff0c;这样可以用来接入键盘、鼠标等 USB 外设。 USB 简介 USB 有两种设备&#xff1a;HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG&#xff0c;即设备角色可以动态切换。 切换方…

ZYNQ上的简单 FSK 基带发射器

绪论 由于某种需求需要生成正弦波&#xff0c;因此使用 C 应用程序中的sin()函数来计算单位圆的幅度值&#xff0c;然后将该幅度值转换为 AD9717 的适当 DAC 代码&#xff08;当然将每个角度值转换为弧度&#xff09;。 能够使用DAC生成简单的正弦波&#xff0c;下一个想法就是…