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

news/2024/5/19 13:01:29 标签: 面试, 设计模式, 责任链模式

责任链模式

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.niftyadmin.cn/n/5004361.html

相关文章

0077__浅析C++临时对象的产生相关问题

https://www.cnblogs.com/missmzt/p/5490072.html 浅析C临时对象的产生相关问题_使用匿名的临时对象减少临时对象产生_z0n3的博客-CSDN博客

开发指导—利用组件插值器动画实现 HarmonyOS 动效

一. 组件动画 在组件上创建和运行动画的快捷方式。具体用法请参考通用方法。 获取动画对象 通过调用 animate 方法获得 animation 对象&#xff0c;animation 对象支持动画属性、动画方法和动画事件。 <!-- xxx.hml --><div class"container"> <di…

JVM--Hotspot Architecture 详解

一、Java Virtual Machine &#xff08;JVM&#xff09;概述 Java Virtual Machine 虚拟机 &#xff08;JVM&#xff09; 是一种抽象的计算机。JVM本身也是一个程序&#xff0c;但是对于编写在其中执行的程序来说&#xff0c;它看起来像一台机器。对于特定的操作系统&#xff…

STC15单片机特有的PWM寄存器和普通定时器实现PWM输出

STC15单片机特有的PWM寄存器和普通定时器实现PWM输出 🌿主要针对STC15W4型号特有的6通道15位专门的高精度PWM。 ✨STC15W4K32S4系列单片机具有6通道15位专门的高精度PWM(带死区控制)和2通道CCP(利用它的高速脉冲输出功能可实现11~16位PWM);(STC15F/L2K60S2系列单片机具有3通…

大数据(八):Pandas的基础应用详解(五)

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

如何在macOS上使用最新版的Bison来构建项目,而不是Xcode工具链内嵌的2.3版本

在很多项目的编译中需要使用 Bison&#xff0c;而且版本需要至少为 3.0&#xff0c;不然会出现以下错误。 Could NOT find BISON: Found unsuitable version "2.3", but required is atleast "3.0" (found /usr/bin/bison)这时候你可能使用brew install bi…

安装对应版本pytorch和torchvision

遇见报错&#xff1a; ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决方法&#xff1a; 1、网站找到对应torch和torchvision版本&#xff0c;cp对应python版本&#xff…

postgresql 安装教程

postgresql 安装教程 本文以window 15版本为教程 文章目录 postgresql 安装教程1.下载地址2.以管理员身份运行3.选择安装路径&#xff0c;点击Next4.选择组件&#xff08;默认都勾选&#xff09;&#xff0c;点击Next5.选择数据存储路径&#xff0c;点击Next6.设置超级用户的…