设计模式(20)职责链模式

news2024/11/17 1:44:24

一、介绍:

1、定义:责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。在责任链模式中,当一个对象无法处理请求时,它会将请求传递给链中的下一个对象,直到找到能够处理请求的对象为止。这种方式可以动态地组织和管理对象,使得请求发送者和接收者之间解耦,提高系统的灵活性和可扩展性。

2、组成结构:

(1)抽象处理者(Handler):定义了一个处理请求的接口,包含抽象处理方法和一个后继连接。

(2)具体处理者(ConcreteHandler):实现抽象处理者接口,具体处理请求的逻辑。如果可以处理请求,则处理请求;否则,将请求传递给下一个处理者。

(3)客户类:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

二、demo:

1、请假:<=3天组长审批;>3且<=5天hr审批再组长审批;>5天hr审批再组长审批再总监审批。


封装请求类:

public class LeaveRequest {
    private String reason;
    private Integer day;
    private String starter;

    LeaveRequest(Integer day,String starter){
        this.day = day;
        this.starter = starter;
    }
    /**省略所有set、get方法*/
}

(1)抽象管理者

public abstract class Manager {

    public String userName;

    Manager superior;

    public Manager(String userName){
        this.userName = userName;
    }

    public void setSuperior(Manager superior){
        this.superior = superior;
    }

    public void handle(LeaveRequest leaveRequest){};
}

(2)具体管理者:

//组长
public class ZzManeger extends Manager {

    public ZzManeger(String userName) {
        super(userName);
    }

    @Override
    public void handle(LeaveRequest leaveRequest) {
       if(leaveRequest.getDay() <= 3){
           System.out.println("请假时长小于3天,组长直接审批");
       }else if(superior != null){
           superior.handle(leaveRequest);
       }
    }
}



//hr
public class HrManeger extends Manager {

    public HrManeger(String userName) {
        super(userName);
    }

    @Override
    public void handle(LeaveRequest leaveRequest) {
        Integer day = leaveRequest.getDay();
       if(day> 3 && day <=5){
           System.out.println("请假时长大于3小于5天,HR审批");
           System.out.println("HR审批完下一级审批");
           if(superior != null) {
               superior.handle(leaveRequest);
           }
       }else if(day >5 && superior != null){
           superior.handle(leaveRequest);
       }
    }
}



//总监
public class ZjManeger extends Manager {

    public ZjManeger(String userName) {
        super(userName);
    }

    @Override
    public void handle(LeaveRequest leaveRequest) {
       System.out.println("总监审批");
    }
}

(3)客户端:

public class Test {
    public static void main(String args[]){
        //链设置,组长-->hr-->总监
        Manager zz = new ZzManeger("组长张三");
        Manager hr = new HrManeger("hr李四");
        Manager zj = new ZjManeger("总王五");
        zz.setSuperior(hr);
        hr.setSuperior(zj);
        //请假,从自己最近的上级即组长请求
        //1、<=3天
        LeaveRequest leaveRequest = new LeaveRequest(3,"发起人");
        zz.handle(leaveRequest);
        System.out.println("*********************");
        //2、>3 <=5天
        leaveRequest.setDay(5);
        zz.handle(leaveRequest);
        System.out.println("*********************");
        //3、>5天
        leaveRequest.setDay(7);
        zz.handle(leaveRequest);
    }
}


输出:
请假时长小于3天,组长直接审批
*********************
请假时长大于3小于5天,HR审批
HR审批完下一级审批
总监审批
*********************
总监审批

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

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

相关文章

SpringSecurity6从入门到上天系列第二篇:搭建SpringSecurity6的入门级别程序!

文章目录 前言 1&#xff1a;环境要求 2&#xff1a;技术要求 一&#xff1a;搭建SpringBoot环境 1&#xff1a;创建空项目 2&#xff1a;创建SpringBoot项目 3&#xff1a;编写一个简单的controller 二&#xff1a;整合SpringSecurity 1&#xff1a;引入依赖 2&…

微信小程序设计之目录结构其他文件介绍

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

Linux基础环境开发工具的使用(yum,vim,gcc,g++)

Linux基础环境开发工具的使用[yum,vim,gcc,g] 一.yum1.yum的快速入门1.yum安装软件2.yum卸载软件 2.yum的生态环境1.操作系统的分化2.四个问题1.服务器是谁提供的呢?2.服务器上的软件是谁提供的呢?3.为什么要提供呢?4.yum是如何得知目标服务器的地址和下载链接呢?5.软件源 …

XML教学视频(黑马程序员精讲 XML 知识!)笔记

第一章XML概述 1.1认识XML XML数据格式&#xff1a; 不是html但又和html有点相似 XML数据格式最主要的功能就是数据传输&#xff08;一个服务器到另一个服务器&#xff0c;一个网站到另一个网站&#xff09;配置文件、储存数据当做小型数据可使用、规范数据格式让数据具有结…

TypeScript深度剖析:TypeScript 中接口的应用场景?

一、是什么 接口是一系列抽象方法的声明&#xff0c;是一些方法特征的集合&#xff0c;这些方法都应该是抽象的&#xff0c;需要由具体的类去实现&#xff0c;然后第三方就可以通过这组抽象方法调用&#xff0c;让具体的类执行具体的方法 简单来讲&#xff0c;一个接口所描述…

PHP自定义文件缓存实现

文件缓存&#xff1a;可以将PHP脚本的执行结果缓存到文件中。当一个PHP脚本被请求时&#xff0c;先查看是否存在缓存文件&#xff0c;如果存在且未过期&#xff0c;则直接读取缓存文件内容返回给客户端&#xff0c;而无需执行脚本 1、文件缓存写法一&#xff0c;每个文件缓存一…

优化改进YOLOv5算法:加入SPD-Conv模块,让小目标无处遁形——(超详细)

1 SPD-Conv模块 论文:https://arxiv.org/pdf/2208.03641v1.pdf 摘要:卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而,当图像分辨率较低或物体较小时,它们的性能会灾难性下降。这是由于现有CNN常见的设计体系结构中有缺陷,即使用卷积…

对PySide6 say Hello(包含环境配置) ——PyQt

前言 一直想学一下python&#xff0c;特别是十一前抢票时达到顶峰。我正好是Qter&#xff0c;所以在网上找了一个教程直接学PyQt。 配置PyQt环境 当前环境 Win10Qt5.15.2 python3.11 之前安装python时好像自动安装了python的包管理工具pip&#xff0c;配置pyqt环境所需要安装…

css:transform实现平移、旋转、缩放、倾斜元素

目录 文档语法示例旋转元素 transform-rotate旋转过渡旋转动画 参考文章 文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform 语法 /* Keyword values */ transform: none;/* Function values */ transform: matrix(1, 2, 3, 4, 5, 6); transform: translate…

c/c++程序的内存开辟时 的内存情况

我们写的代码都是要存放在内存空间中的&#xff0c;我们经常说堆区&#xff0c;静态区&#xff0c;还有栈区&#xff0c;相信很多人不是很明白&#xff0c;在今天这篇博客中让大家对它们有一个粗略的认识 1.栈区&#xff08;static&#xff09; 在执行函数时&#xff0c;函数内…

H5web微信刮一刮效果

H5web微信刮一刮效果 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>千万别来南宁</title> <meta name"apple-touch-fullscreen" content"yes" /> <meta name"format-detec…

初识Java 16-2 字符串

目录 正则表达式 简单的介绍 正则表达式的创建 量词 Pattern和Matcher 1. find() 2. 分组 3. start()和end() 4. compile()中的标记 5. split() 6. 替换操作 reset() 正则表达式和Java的I/O 本笔记参考自&#xff1a; 《On Java 中文版》 正则表达式 正则表达式是…

【深入浅出汇编语言】寄存器精讲第二期

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️物理地址二. ⛳️16位结构的CPU三. ⛳️8086CPU给出物理地址的方…

你被骗了吗?别拿低价诱骗机器视觉小白,4000元机器视觉系统怎么来的?机器视觉工程师自己组装一个2000元不到,还带深度学习

淘宝闲鱼&#xff0c;大家搜搜铺价格&#xff0c;特别是机器视觉小白。 机架&#xff1a;&#xff08;新的&#xff09;200元以下。(看需求&#xff0c;自己简单打光&#xff0c;买个50元的。如果复杂&#xff0c;就拿给供应商免费打光) 相机&#xff0c;镜头&#xff1a;&am…

有效的数独

题目链接 有效的数独 题目描述 注意点 board.length 9board[i].length 9board[i][j] 是一位数字&#xff08;1-9&#xff09;或者 ‘.’ 解答思路 首先判断行是否满足数独条件&#xff0c;再判断列是否满足数独条件&#xff0c;最后再判断划分的3x3方格是否满足数独条件…

2.数据结构-链表

概述 目标 链表的存储结构和特点链表的几种分类及各自的存储结构链表和数组的差异刷题(反转链表) 概念及存储结构 先来看一下动态数组 ArrayList 存在哪些弊端 插入&#xff0c;删除时间复杂度高需要一块连续的存储空间&#xff0c;对内存要求比较高&#xff0c;比如要申请…

SSM培训报名管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 培训报名管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开…

vim

简介 vim是一款多模式的文本编辑器&#xff0c;vim里面还有很多子命令&#xff0c;来进行代码的编写操作 常用模式图 命令模式 光标移动 shif $ 光标定义到当前行的最右侧结尾 shift ^ 光标定义到当前行的最左侧开头 shift g 光标定位到文本最末尾…

激光雷达点云基础-点云滤波算法与NDT匹配算法

激光雷达点云处理在五年前就做了较多的工作&#xff0c;最近有一些新的接触发现激光雷达代码原理五年前未见重大更新&#xff0c;或许C与激光雷达结合本身就是比较高的技术门槛。深度学习调包侠在硬核激光雷达技术面前可以说是完全的自愧不如啊。 1、点云滤波 在获取点云数据…

利用远程IO模块,轻松驾驭食品包装生产的自动化

常见的自动化包装系统&#xff0c;它的核心部分通常由一系列高端设备组成&#xff0c;包括自动开箱机、自动封箱机、自动捆扎机、装箱机器人、码垛机器人等。这些设备协同工作&#xff0c;形成一条高效运转的生产线&#xff0c;从开箱到装箱&#xff0c;再到码垛&#xff0c;每…