设计模式—行为型模式之责任链模式

news2024/11/16 1:54:06

设计模式—行为型模式之责任链模式

责任链(Chain of Responsibility)模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。它属于对象行为型模式。

包含如下角色:

  • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类(Client)角色:负责创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

示例

员工在企业请假,需要小组长审批,再由领导审批,再由人事同意,才可以。

抽象工作人员类如下:

@Data
@ToString
public abstract class Worker {
    private String name;

    //下一个处理者
    private Worker nextHandler;

    /**
     * 处理请求
     */
    public abstract void handleRequest();
}

请假者和审批者如下:

/**
 * 请假者
 */
public class LeaveEmployee extends Worker{
    @Override
    public void handleRequest(){
        System.out.println(this.getName() + "发起请假请求");
        //链子下一个进行请求
        if(this.getNextHandler() != null){
            this.getNextHandler().handleRequest();
        }
    }
}
/**
审批者
*/
public class Approver extends Worker{
    @Override
    public void handleRequest() {
        System.out.println(this.getName() + "正在处理");
        if(this.getNextHandler() != null){
            //下一个人去请求
            this.getNextHandler().handleRequest();
        }else{
            System.out.println("到"+this.getName()+"这里最终处理完成");
        }
    }
}

测试类如下:

public class ChainTest {
    public static void main(String[] args) {
        //请假者
        LeaveEmployee leaveEmployee = new LeaveEmployee();
        leaveEmployee.setName("张三");

        //审批者1
        Approver approver1 = new Approver();
        approver1.setName("审批者1号");

        //审批者2号
        Approver approver2 = new Approver();
        approver2.setName("审批者2号");


        //审批者3号
        Approver approver3 = new Approver();
        approver3.setName("审批者3号");

        //组装链条
        leaveEmployee.setNextHandler(approver1);
        approver1.setNextHandler(approver2);
        approver2.setNextHandler(approver3);

        //请假
        leaveEmployee.handleRequest();
    }
}

运行结果如下:

运行结果

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

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

相关文章

Java设计模式-外观模式(11)

大家好,我是馆长!今天开始我们讲的是结构型模式中的外观模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式,共7种设计模式。。 外观模式(Decorator Pattern) 定义 外观(Facade)模式一种通…

【活动回顾】CSDN 成都城市开发者社区年度聚会 - 圆满结束!

文章目录 前言一、活动介绍二、精彩分享内容2.1、《COC 成都社区情况和活动介绍》2.2、《2023 年你最关注的话题》2.3、《紧跟技术潮流》2.4、《2024 年抓住技术新红利》2.5、一起干饭啦2.6、合影留念 三、亚马逊云科技 User Group3.1、社区介绍3.2、持续招募3.3、微信交流群 总…

css3表格练习

1.效果图 2.html <div class"line"></div><h3>获奖名单</h3><!-- 表格 cellspacing内边距 cellpadding外边距--><table cellspacing"0" cellpadding"0" ><!-- thead表头 --><thead><tr>…

【JavaEE】网络原理: 网络编程套接字(概念)

目录 1.什么是网络编程 2.网络编程中的基本概念 2.1发送端和接收端 2.2请求和响应 2.3客户端和服务端 3.Socket套接字 4.Socket编程注意事项 1.什么是网络编程 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信 (…

程序员的平均结婚年龄

关于程序员的平均结婚年龄&#xff0c;根据之前的信息&#xff1a; 一项对全球10000名在职程序员的调查数据显示&#xff0c;程序员第一次结婚的平均年龄是39.43周岁。而在中国的部分地区&#xff0c;如北京等地&#xff0c;程序员群体中普遍反映的结婚年龄是在30岁左右。 程序…

Title: 提升大型语言模型在知识图谱完成中的性能

基本信息 论文题目: Making Large Language Models Perform Better in Knowledge Graph Completion Making Large Language Models Perform Better in Knowledge Graph Completion (arxiv.org)https://arxiv.org/pdf/2310.06671.pdf 作者: Yichi Zhang, Wen Zhang 机构: Col…

25考研政治备考计划

各位小伙伴大家好&#xff0c;今天给大家分享的是25考研政治复习备考计划。 政治没有基础阶段&#xff0c;直接就是强化&#xff0c;强化的内容也就是听课&#xff0c;刷题。 【时间安排】 *7-9月中 徐涛老师或腿姐强化课&#xff0c;推荐刷肖1000 *9月中-10月中 背腿姐的背…

文件上传之大文件分块上传进度控制处理

在分块上传内容结束以后的事件监听&#xff0c;我们会实现 unlinkSync 删除临时文件操作&#xff0c;那么试想一下&#xff0c;在这个事件监听中&#xff0c;我们是否可以通过totalChunks以及currentChunk获取当前上传的进度情况呢&#xff1f; 后端 upload上传接口&#xff…

Go 知识chan

Go 知识chan 1. 基本知识1.1 定义1.2 操作1.3 操作限定1.4 chan 读写 2. 原理2.1 数据结构2.2 环形队列2.3 等待队列2.4 类型消息2.5 读写数据2.6 关闭chan 3. 使用3.1 操作符使用3.2 select3.3 for-range https://a18792721831.github.io/ 1. 基本知识 chan是go里面里面提供…

应用机器学习的建议

一、决定下一步做什么 在你得到你的学习参数以后&#xff0c;如果你要将你的假设函数放到一组新的房屋样本上进行测试&#xff0c;假如说你在预测房价时产生了巨大的误差&#xff0c;你想改进这个算法&#xff0c;接下来应该怎么办&#xff1f;实际上你可以考虑先采用下面的几种…

「QT」QString类的详细说明

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「

并查集:连通块中点的数量

import java.io.*; import java.util.Scanner;public class Main{static int N 100010;static int[] p new int[N]; //存储每个节点的父亲节点,一开始默认p[i]i;static int[] size new int[N]; //存储每个连通块里含有多少个节点static BufferedReader in new BufferedR…

数学知识第二期 约数

前言 约数也是很重要的基础数学知识&#xff0c;希望大家能够完全掌握&#xff01;&#xff01;&#xff01; 一、约数的知识 简介 约数&#xff0c;又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数&#xff0c;就说a能被b整除&#xff0c;或b能整除a。a称为b的…

【Java与网络6】实现一个自己的HTTP浏览器

前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理&#xff0c;本文我们来整个大活&#xff1a;自己实现一个简单的浏览器。 目录 1.主线程循环体 2.readHostAndPort()方法的实现 3.readHttpRequest()方法的实现 4.sendHttpRequest()方法的实现 5.readHttpRespons…

vector迭代器失效

目录 迭代器失效的场景 insert插入元素时迭代器失效 erase删除元素时迭代器失效 本期我们主要进行vector迭代器失效问题的讨论。 迭代器失效的场景 insert插入元素时迭代器失效 先看代码&#xff1a; iterator insert(iterator pos, T val){assert(pos > _start);ass…

不知道如何批量处理图片

你是否曾经遇到过需要批量处理大量图片的情况&#xff1f;例如&#xff0c;需要将多张图片转换为统一格式、调整大小或进行美化处理。这种时候&#xff0c;如果一张张手动处理&#xff0c;不仅效率低下&#xff0c;还容易出错。那么&#xff0c;有没有一种方法可以快速、准确地…

web前端项目-动画特效【附源码】

文章目录 一&#xff1a;赛车游戏动画HTML源码&#xff1a;JS源码&#xff1a;CSS源码&#xff1a;&#xff08;1&#xff09;normalize.css&#xff08;2&#xff09;style.css 二&#xff1a;吉普车动画演示HTML源码&#xff1a;CSS源码&#xff1a;&#xff08;1&#xff09…

matlab对负数开立方根得到虚数的解决方案

问题描述&#xff1a;在matlab中&#xff0c;对负数开立方根&#xff0c;不出意外你将得到虚数。 例如 − 27 3 \sqrt[3]{-27} 3−27 ​&#xff0c;我们知道其实数解是-3&#xff0c;但在matlab中的计算结果如下&#xff1a; 问题原因&#xff1a;matlab中的立方根运算是在…

仅使用 Python 创建的 Web 应用程序(前端版本)第08章_商品详细

在本章中,我们将实现一个产品详细信息页面。 完成后的图像如下。 Model、MockDB、Service都是在产品列表页实现的,所以创建步骤如下。 No分类内容1Page定义PageId并创建继承自BasePage的页面类2Application将页面 ID 和页面类对添加到 MultiPageApp 的页面中Page:定义PageI…

项目管理平台

技术架构&#xff1a; MySQL、Servlet、JSP 功能模块&#xff1a; 从管理员角度看: 用户登入系统后&#xff0c;可以修改管理员的密码。同时具有以下功能&#xff1a; 1、管理员可以管理具体项目信息。 2、管理员可以管理项目经费信息。 3、管理员可以管理项目资源信息。 4、…