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

news/2024/5/19 11:49:50 标签: 设计模式, 责任链模式

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

责任链(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.niftyadmin.cn/n/5348473.html

相关文章

函数类(Function Classes)和 富函数类(Rich Function Classes)

目录 函数类(Function Classes) 富函数类(Rich Function Classes) 函数类(Function Classes) Flink暴露了所有UDF函数的接口,具体实现方式为接口或者抽象类,例如MapFunction、Filt…

Android Studio离线开发环境搭建

Android Studio离线开发环境搭建 1.下载离线和解压包2.创建工程3.创建虚拟机tips 1.下载离线和解压包 下载地址 百度网盘:https://pan.baidu.com/s/1XBPESFOB79EMBqOhFTX7eQ?pwdx2ek 天翼网盘:https://cloud.189.cn/web/share?code6BJZf2uUFJ3a&#…

微软 Power Apps Canvas App 画布应用将上传的附件转化为base64编码操作

微软 Power Apps Canvas App 画布应用将上传的附件结合Power Automate转化为base64编码操作 在使用canvas app的过程中,我们有时需要将上传的文件转换为base64存入数据库或者,调用外部接口传参,那么看下如何将文件转化为base64编码格式。 首先…

docker 构建应用

docker 应用程序开发手册 开发 docker 镜像 Dockerfile 非常容易定义镜像内容由一系列指令和参数构成的脚本文件每一条指令构建一层一个 Dockerfile 文件包含了构建镜像的一套完整指令指令不区分大小写,但是一般建议都是大写从头到尾按顺序执行指令必须以 FROM 指…

编程笔记 html5cssjs 060 css响应式布局

编程笔记 html5&css&js 060 css响应式布局 一、响应式布局二、Bootstrap简介总结 CSS响应式布局是一种可以在不同设备(例如桌面电脑、平板电脑、手机等)上自动调整页面布局和样式的技术。 一、响应式布局 使用CSS响应式布局的关键是媒体查询&am…

JavaScript中有哪些函数类型

JavaScript中的函数类型有很多种,下面列出了一些常见的函数类型及其示例: 一元函数(Unary Functions):只接收一个参数的函数。 一元函数是指函数方程中只包含一个自变量的函数。例如,函数yF(x)是一元函数&…

【html+css+js】实现图片轮播效果

简单实现 <html><head><style type"text/css">*{background-color:green;}#lunbo{ width:600px; height:600px;position:relative;left:100px;top:50px;} //定义轮播图片所显示的位置ul{width:100%; height:100%; position:relative;left:0px;top…

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的信息交换格式&#xff0c;其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型&#xff0c;本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …