责任链模式(行为型)

news2025/1/20 3:55:19

目录

一、前言

二、责任链模式

三、总结


一、前言

        责任链模式(Chain of Responsibility Pattern)也叫职责链模式,是一种行为型设计模式,职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求,直到有一个对象处理它为止。

       责任链模式由以下角色组成:

Handler(抽象处理者):

定义一个处理请求的接口,包含处理请求的方法,还包含一个指向下一个处理者的引用(即链中的下一个处理者)

Concrete Handler(具体处理者):

继承或实现抽象处理者接口,具体处理请求的逻辑在这里实现,如果不能处理当前请求,则将请求传递给下一个处理者

Client(客户端):

负责创建并组装职责链,将请求发送给链中的第一个处理者

        整个责任链模式的结构图:

二、责任链模式

        比如一些请求制度,我们可以设置组长能够审批3天因为的假期,经理可以审批10天以内的假期,CEO可以审批30天以内的假期,不允许超过30天,这种时候就可以使用责任链模式进行演示。

        首先创建Handler类:

public abstract class Handler {

    public Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(int request);
}

        接着创建具体的实现类:

public class ConcreteHandlerOne extends Handler{

    @Override
    public void handleRequest(int request) {
        if(request >= 0 && request < 3){
            System.out.println(String.format("组长同意请假:%s天", request));
        }else if(successor != null){
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandlerTwo extends Handler{
    @Override
    public void handleRequest(int request) {
        if(request >= 3 && request < 10){
            System.out.println(String.format("经理同意请假:%s天", request));
        }else if(successor != null){
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandlerThree extends Handler{
    @Override
    public void handleRequest(int request) {
        if(request >= 10 && request <= 30){
            System.out.println(String.format("CEO同意请假:%s天", request));
        }else {
            System.out.println("请假天数不符合要求");;
        }
    }
}

        最后是客户端Client类:

public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandlerOne();
        Handler handler2 = new ConcreteHandlerTwo();
        Handler handler3 = new ConcreteHandlerThree();

        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);

        handler1.handleRequest(1);
        handler1.handleRequest(4);
        handler1.handleRequest(15);
        handler1.handleRequest(40);
    }
}

        运行结果:

三、总结

        优点与缺点:

优点:

降低耦合度:

请求的发送者和接收者解耦,发送者无需知道具体的接收者是谁,也无需了解处理链的结构

增加灵活性:

可以在运行时动态地添加或修改处理者,从而灵活地改变职责链

职责分担:

每个处理者只需关注自己能处理的任务,职责单一明确

增强扩展性:

增加新的具体处理者非常方便,不影响已有的系统

缺点:

可能导致请求未被处理:

如果链条上的所有处理者都不能处理请求,可能导致请求未被处理,除非在链的末端有个默认处理者

调试复杂:

由于请求是在链条上进行传递,调试起来较为困难,尤其是在链条较长或处理逻辑复杂时

性能问题:

如果链条很长,可能会影响系统性能,尤其是在每个处理者都需要进行复杂判断时

        应用场景:

请求的处理需要多个对象中的一个或多个进行处理:

如多个审批人依次审批请求的场景,每个审批人根据自己的权限或条件决定是否审批或将请求传递给下一个审批人

动态指定请求的处理者:

如在一个系统中,根据不同的请求类型动态选择不同的处理者

需要在处理者之间进行职责分离:

如在责任明确的系统中,每个模块各司其职,如日志记录、权限校验、数据处理等

例如时间处理系统、审批工作流、请求过滤器

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

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

相关文章

游戏UI设计秘诀:专家总结与实际案例解析!

随着游戏产业的不断发展&#xff0c;游戏UI界面设计变得越来越重要。一个好的游戏UI界面设计可以让玩家更容易理解游戏规则&#xff0c;提高游戏的可玩性&#xff0c;增加游戏的吸引力。在本文中&#xff0c;我们将讨论游戏UI界面设计的重要性和一些常见的设计原则。 1. 游戏U…

IntelliJ IDEA安装

IntelliJ IDEA 的安装、配置与使用-简化版 一、IntelliJ IDEA 介绍 1.JetBrains 公司介绍 IDEA(https://www.jetbrains.com/idea/)是 JetBrains 公司的产品&#xff0c;公司旗下还有其 它产品&#xff0c;比如&#xff1a; ➢ WebStorm&#xff1a;用于开发 JavaScript、HT…

映射网络驱动器自动断开的解决方法

如果将驱动器映射到网络共享&#xff0c;映射的驱动器可能会在定期处于非活动状态后断开连接&#xff0c;并且 Windows 资源管理器可能会在映射驱动器的图标上显示红色 X。&#xff0c;出现此行为的原因是&#xff0c;系统可以在指定的超时期限后断开空闲连接&#xff0c; (默认…

pyopengl 立方体 正投影,透视投影

目录 顶点和线的方式 划线的方式实现: 顶点和线的方式 import numpy as np from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from OpenGL.GL import * from OpenGL.GLU import * import sys…

【一小时学会Charles抓包详细教程】Charles请求Filter(过滤)功能 (9)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 Charles请求Fi…

房地产3d全景数字化看房成为转发的好工具

在短视频盛行的时代&#xff0c;某地产企业为了吸引客流&#xff0c;联合我们深圳VR公司定制了楼盘小区3D全景展示视频&#xff0c;不同于市面上常见的楼盘视频或3D电影&#xff0c;楼盘小区3D全景展示视频让您在小区建成之前&#xff0c;就能提前感受未来的生活场景。 无需昂贵…

九、参数处理器

debug调试&#xff0c;一个参数的调通了&#xff0c;但是两个参数的会失败 总结一下&#xff1a; 到现在已经学了有10节了&#xff0c;我对mybatis底层的执行流程算是挺了解的了&#xff0c;把流程拆解开&#xff0c;每一个小步骤都是非常多的代码实现&#xff0c;代码都能看懂…

Elasticsearch:ES|QL 查询 TypeScript 类型(二)

在我之前的文章 “Elasticsearch&#xff1a;ES|QL 查询 TypeScript 类型&#xff08;一&#xff09;”&#xff0c;我们讲述了如何在 Nodejs 里对 ES|QL 进行查询。在今天的文章中&#xff0c;我们来使用一个完整的例子来进行详细描述。更多有关如何使用 Nodejs 来访问 Elasti…

【学习笔记】MySQL(Ⅰ)

MySQL(Ⅰ) 1、 介绍 1.1、概述 1.2、MySQL 的优缺点 1.4、关系型数据库模型2、 基础篇 —— SQL(结构化查询语言) 2.1、通用语法 2.2、SQL 语句的分类 2.3、DDL 语句 2.3.1 数据库结构相关的语法 2.3.2 数据表相关的语…

HTML跨年烟花

目录 写在前面 关于小编 HTML简介 程序设计 系列文章 写在后面 写在前面 学会了这个html烟花秀&#xff0c;跨年就不缺文案喽~ 关于小编 平易近人&#xff0c;慈眉善目&#xff0c;爱交朋友&#xff0c;舍己为人&#xff0c;和蔼可亲&#xff0c;能说会道&#xff0c;…

中国250米全钾(tk)含量数据

全钾是指土壤中含有的全部钾。是水溶性钾、交换性钾、非交换性钾和结构态钾的总和。土壤全钾含量为0.3%〜3.6%&#xff0c;一般为1%〜2%。全钾仅反映了土壤钾素的总储量.其中90%〜98%在相当长时间内是无效的&#xff0c;因此全钾值不能用以指导施肥。 土壤中的钾包括3种形态&am…

JVM类加载机制和双亲委派

类加载机制 java文件需要编译成字节码文件(.class文件)&#xff0c;jvm是通过类加载机制&#xff0c;将.class文件加载进内存&#xff0c;经过验证连接->初始化直到使用该对象的过程就是类加载机制&#xff0c;当new对象的时候&#xff0c;jvm首先去常量池寻找该类的符号引用…

try…except语句

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在程序开发时&#xff0c;有些错误并不是每次运行都会出现。例如&#xff0c;实例01&#xff0c;只要输入的数据符合程序的要求&#xff0c;程序就可…

外汇天眼:Marqeta加速欧洲业务发展,华沙办公室正式开幕

Marqeta&#xff0c;全球现代卡发行平台&#xff0c;今天宣布在波兰华沙设立新办公室&#xff0c;以支持其长期的业务和增长战略。通过在波兰设立业务&#xff0c;Marqeta直接获得了进入欧盟的通道&#xff0c;为其在跨境增长和提供增强服务奠定了良好基础。波兰作为欧洲中心位…

代码随想录算法训练营第十三天| 102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

102. 二叉树的层序遍历 题目链接&#xff1a;102. 二叉树的层序遍历 文档讲解&#xff1a;代码随想录 状态&#xff1a;dfs没写出来&#xff0c;bfs不知道如何分层 import java.util.*;public class BinaryTreeLevelOrderTraversal {// 用于存储每一层的节点值List<List<…

大数据之Schedule调度错误(一)

当我们在利用ooize发起整个任务的调度过程中,如果多个调度任务同时运行并且多个调度任务操作了相同的表,那么就会出现如下的错误关系: Invalid path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/admin/xxx: No files matching path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/ad…

MySQL—函数(介绍)—字符串函数(基础)

一、引言 提到函数&#xff0c;在SQL分类中DQL语句中有一个聚合函数&#xff0c;如COUNT()、SUM()、MAX()等等。这些都是一些常见的聚合函数&#xff0c;而聚合函数只是函数的一种&#xff0c;接下来会详细的学习和介绍一下函数的应用场景和以及 mysql 当中文件的函数有哪些。 …

JAVA小案例-用循环语句输出1-1000以内能被5整除的数,每5个一行

JAVA小案例-用循环语句输出1-1000以内能被5整除的数&#xff0c;每5个一行 直接看代码&#xff1a; public class Zhengchu {/*** 用循环语句输出1-1000以内能被5整除的数&#xff0c;每5个一行** param args*/public static void main(String[] args) {for (int i 1; i <…

HTML 转义字符(escape characters)及其对应的符号(symbols)

以下是常见的 HTML 转义字符及其对应的符号&#xff0c;这些可以用于在 HTML 或 JSX 中避免解析错误和特殊字符的冲突&#xff1a; 空格 ( ): 或 引号: 单引号&#xff08;&#xff09;&#xff1a;&apos;、&lsquo;、、&rsquo;双引号&#xff08;"&#x…

GPS定位器专用可编程晶振SG-8018CB

随着全球定位系统&#xff08;GPS&#xff09;技术的普及&#xff0c;GPS定位器在各种领域中得到了广泛应用&#xff0c;如车辆跟踪、个人定位、资产管理和户外活动等。为了确保GPS定位器的高精度和可靠性&#xff0c;选择合适的时钟源至关重要。SG-8018CB可编程晶振作为一款高…