责任链模式(行为型)

目录

一、前言

二、责任链模式

三、总结


一、前言

        责任链模式(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.mfbz.cn/a/691338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--损失函数

损失函数&#xff08;Loss Function&#xff09;&#xff0c;也称为代价函数&#xff08;Cost Function&#xff09;或误差函数&#xff08;Error Function&#xff09;&#xff0c;是机器学习和统计学中的一个重要概念。它用于量化模型预测值与真实值之间的差异。损失函数的值…

毫米波雷达深度学习技术-1.6目标识别2

1.6.4 自动编码器和变体自动编码器 自编码器包括一个编码器神经网络&#xff0c;随后是一个解码器神经网络&#xff0c;其目的是在输出处重建输入数据。自动编码器的设计在网络中施加了一个瓶颈&#xff0c;它鼓励原始输入的压缩表示。通常&#xff0c;自编码器旨在利用数据中的…

Spring boot项目

一. Spring boot 安装地址 https://start.spring.io/ 二. 选择 三. idea配置 找到下载的文件解压缩&#xff0c;打开pom.xml(选择从idea打开)

Shell以及Shell编程

Shell的任务 ①分析命令&#xff1b; ②处理通配符、变量替换、命令替换、重定向、管道和作业控制&#xff1b; ③搜索命令并执行。 内部命令&#xff1a;内嵌在Shell中。 外部命令&#xff1a;存在于磁盘上的独立可执行文件。 #&#xff01;/bin/bash #! 称为一个幻数&…

【Vue3】理解toRef() 和 toRefs()

历史小剧场 知道可能面对的困难和痛苦&#xff0c;在死亡的恐惧中不断挣扎&#xff0c;却仍然能战胜自己&#xff0c;选择这条道路&#xff0c;这才是真正的勇气。----《明朝那些事儿》 前言 toRef 和 toRefs 是Vue3中的响应式转换工具函数 toRef: 不影响源对象的情况下&#x…

DIO控制卡,IRIG-B码卡,PCI-E总线接口卡,百兆数据采集卡

DIO控制卡 ● 4路继电器输出&#xff08;5A250VAC&#xff09; ● 4路开关量输入&#xff08;24VDC&#xff09; ● 1路IDE接口 ● 端口浪涌保护 IRIG-B码卡 ● 1路IRIG-B对时接口&#xff08;RS485/光纤&#xff09; ● 1路IEEE1588 V2对时接口&#xff08;RJ45/光纤&#…

Python在股票交易分析中的应用:布林带与K线图的实战回测

引言 在股票交易的世界中&#xff0c;技术分析是投资者们用来预测市场动向的重要工具。布林带&#xff08;Bollinger Bands&#xff09;作为一种动态波动范围指标&#xff0c;因其直观性和实用性而广受欢迎。本文将通过Python代码&#xff0c;展示如何使用布林带结合K线图来分…

数据结构之计数排序算法【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

【python报错】TypeError: dict.get() takes no keyword arguments

【Python报错】TypeError: dict.get() takes no keyword arguments 在Python中&#xff0c;字典&#xff08;dict&#xff09;是一种非常灵活的数据结构&#xff0c;用于存储键值对。dict.get()方法是用来从字典中获取与给定键&#xff08;key&#xff09;相关联的值&#xff0…

WordPress网站更换域名后如何重新激活elementor

在创建WordPress网站时&#xff0c;我们常常需要更改域名。但是&#xff0c;在更换域名后&#xff0c;你可能会遇到一个问题&#xff1a;WordPress后台中的Elementor插件授权状态会显示为不匹配。这时&#xff0c;就需要重新激活Elementor插件的授权。下面我会详细说明如何操作…

数据结构之ArrayList与顺序表(下)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 ArrayList的具体使用 118. 杨辉三角 扑克洗牌算法 接上篇&#xff1a;数据结构之ArrayLis…

mqtt-emqx:简单安装emqx

安装依赖 yum install -y epel-release libatomic下载 cd /chz/install/emqx wget https://www.emqx.com/en/downloads/broker/5.7.0/emqx-5.7.0-el7-amd64.tar.gz解压 mkdir -p emqx && tar -zxvf emqx-5.7.0-el7-amd64.tar.gz -C emqx后台运行 cd /chz/install/e…

ChatGPT-4o体验demo

OpenAI 最近推出了其最新的人工智能语言模型——GPT-4O。该模型是在原有 GPT-4 的基础上进行优化而成&#xff0c;旨在提升生成质量和响应速度。GPT-4O 采用了更加高效的架构设计&#xff0c;使其在处理复杂文本时表现出更快的速度和更高的准确性。GPT-4O 在训练过程中融入了最…

【每日刷题】Day59

【每日刷题】Day59 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1103. 分糖果 II - 力扣&#xff08;LeetCode&#xff09; 2. 1051. 高度检查器 - 力扣&#xff08…

C语言详解(动态内存管理)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

CTF Show MISC做题笔记

MISCX 30 题目压缩包为misc2.rar,其中包含三个文件:misc1.zip, flag.txt, hint.txt。其中后两个文件是加密的。 先解压出misc1.zip, 发现其中包含两个文件&#xff1a;misc.png和music.doc。其中后面文件是加密的。 解压出misc.png,发现图片尾部有消息&#xff1a;flag{flag…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

使用CodeGen进行程序综合推理

Program Synthesis with CodeGen — ROCm Blogs (amd.com) CodeGen是基于标准Transformer的自回归语言模型家族&#xff0c;用于程序合成&#xff0c;正如作者所定义的&#xff0c;它是一种利用输入-输出示例或自然语言描述生成解决指定问题的计算机程序的方法。 我们将测试的…

哈希桶封装unordered_map、unordered_set

哈希桶源代码 我们将由下列的哈希桶来模拟封装STL库中的unordered_map和unordered_set 注意&#xff1a;为了实现封装unordered_map和unordered_set&#xff0c;我们需要对下列源码进行优化。 //哈希桶 namespace hashbucket {template<class K,class V>struct HashNo…

双列集合基础知识

package exercise;import java.util.HashMap; import java.util.Map;public class Demo1 {public static void main(String[] args) {Map<String, String> map new HashMap<>();//在添加数据的时候&#xff0c;如果键不存在&#xff0c;那么直接把键值对对象添加到…