责任链模式:构建一条责任链去处理不同级别的日志信息

news2024/11/26 21:30:41

概要

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,在有多个对象(处理者)都可以接收请求的情况下,允许你将多个对象连接成一条处理链,请求沿着处理链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。这种方式在处理一系列请求方面,提供了更灵活、可扩展的解决方案,同时避免了请求发送者和接收者之间的紧密耦合。

chain01

责任链模式的角色

  • 抽象处理者(Handler):一般为抽象类,需要包含一个成员变量来存储指向链上后继节点的引用,同时包含设置后继节点的方法以及处理请求的方法。在处理方法中,需要判断是否自行处理本次请求,还是将请求发送给后继者。
  • 具体处理者(Concrete Handler):实现抽象处理者。
  • 客户类:构建处理链,并向链头的具体处理者提交请求,它不关心处理细节和请求的传递过程。

优点

  • 降低耦合度:将请求发送者和接收者之间进行解耦,降低系统耦合度。
  • 提高系统灵活性和扩展性:可以动态地组合责任链,增加或删除处理对象,灵活调整处理对象的顺序。
  • 符合开闭原则:可以在不修改现有系统的基础上,新增新的处理对象。

缺点

  • 性能问题:请求可能需要沿着链经过多个处理对象才能被处理,这可能导致性能问题。
  • 不保证请求一定被处理:如果没有合适的处理对象处理请求,请求可能会一直传递到链的末尾而未被处理。

适用场景

  • 当有多个对象可以处理同一个请求,具体哪个对象处理请求由运行时刻自动确定,可以使用责任链模式。
  • 当需要在运行时动态地添加或删除处理对象,灵活组合和调整处理流程时,可以使用责任链模式。
  • 当需要避免请求发送者和接收者之间的耦合,可以使用责任链模式。
  • 当需要在不同的处理对象之间共享数据时,可以使用责任链模式。

实现案例

我们都知道在log4j2中,日志级别由低到高可分为8个级别:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF,每个级别只会打印当前级别和以上级别的消息。我们用 INFO、WARN 、ERROR三个日志级别举例,如果日志级别为INFO,则会打印INFO、WARN 、ERROR三个级别的信息,如果日志级别为ERROR,则只会打印ERROR级别的信息。现在我们模拟这三个级别的日志输出控制器,构建一条处理链去处理不同级别的日志信息。

步骤1:抽象处理者AbstractLogger

public abstract class AbstractLogger {
    public static int INFO = 1;
    public static int WARN = 2;
    public static int ERROR = 3;

    protected int level;

    //责任链中的下一个元素
    protected AbstractLogger nextHandler;

    public void setNext(AbstractLogger nextHandler){
        this.nextHandler = nextHandler;
    }

    public void handleMessage(int level, String message){
        //消息级别高于或等于所设置级别就打印消息
        if(level >= this.level){
            write(message);
        }
        //将请求传递给后继者
        if(nextHandler !=null){
            nextHandler.handleMessage(level, message);
        }
    }
    abstract protected void write(String message);

}

步骤2:分别实现三个具体处理者ErrorConsole、WarnConsole、InfoConsole

public class ErrorConsole extends AbstractLogger {

    public ErrorConsole(){
        //日志级别设为ERROR
        this.level = AbstractLogger.ERROR;
    }

    @Override
    protected void write(String message) {
        System.out.println("[Error Console] - " + message);
    }
}
public class WarnConsole extends AbstractLogger {

    public WarnConsole(){
        //日志级别设为WARN
        this.level = AbstractLogger.WARN;
    }

    @Override
    protected void write(String message) {
        System.out.println("[Warn Console] - " + message);
    }
}
public class InfoConsole extends AbstractLogger {

    public InfoConsole(){
         //日志级别设为INFO
        this.level = AbstractLogger.INFO;
    }

    @Override
    protected void write(String message) {
        System.out.println("[Info Console] - " + message);
    }
}

步骤3:客户端构建责任链,并分别处理不同级别的日志信息

public class Client {
    public static void main(String[] args) {
        //构建责任链,errorConsole为链头,warnConsole和infoConsole为后继节点
        AbstractLogger errorConsole=new ErrorConsole();
        AbstractLogger warnConsole=new WarnConsole();
        AbstractLogger infoConsole=new InfoConsole();
        errorConsole.setNext(warnConsole);
        warnConsole.setNext(infoConsole);

        //统一由责任链的链头接收请求,分别测试三种类型的信息
        errorConsole.handleMessage(AbstractLogger.INFO, "INFO:正常信息");
        System.out.println();

        errorConsole.handleMessage(AbstractLogger.WARN, "WARN:警告信息");
        System.out.println();

        errorConsole.handleMessage(AbstractLogger.ERROR, "ERROR:错误消息");

    }
}

测试结果

image-20230614161118052

由上述代码可知,我们构建了一条责任链去处理日志信息:errorConsole -> warnConsole -> infoConsole,当输入INFO类型的信息时,首先进入errorConsole ,没有进行输出处理,随后进入warnConsole ,也没有进行输出处理,最后进入infoConsole,才进行了输出处理。同理,当输入WARN信息时,后两个处理对象都进行了处理,当输入ERROR信息时,三个处理对象都进行了输出处理。这正好符合我们前面说的,每个日志级别只会打印当前级别和以上级别的消息

总结

通过本篇文章的学习,我们可以看出,当我们有一系列请求存在多个处理对象时,可以将这些处理对象构建成一条处理链,让请求沿着处理链依次进行传递处理,这就是责任链模式。它可以动态地组合处理链,新增和删除处理对象,同时可以随意编排处理对象的顺序,大大提升系统的灵活性和可扩展性,降低系统耦合度。当然,这种模式也存在一定的弊端,比如责任链过长带来处理的延时性,同时不能保证请求一定能得到处理,在日常开发过程中需要结合实际场景进行权衡。

希望这篇文章对你的学习有所帮助,在此感谢你的阅读!

1711edbd2bd444b1b647e09c2c3aff0d

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

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

相关文章

最新水文水动力模型在城市内涝、城市排水、海绵城市规划设计中深度应用丨SWMM排水管网水力、水质建模及海绵与水环境应用

目录 第一部分 CAD、GIS在水力建模过程中的应用 第二部分 SWMM模型深度应用 第三部分 城市内涝一维二维耦合模拟 第四部分 海绵城市关键控制指标计算 第五部分 SWMM二次开发基础 SWMM排水管网水力、水质建模及在海绵与水环境中的应用 随着计算机的广泛应用和各类模型软件…

基于AutoJs7实现的薅羊毛App专业版源码大分享

源码下载链接&#xff1a;https://pan.baidu.com/s/1QvalXeUBE3dADfpVwzF_xg?pwd0736 提取码&#xff1a;0736 专业版肯定比个人版功能强大并且要稳定。增加了很多功能的同时也测试封号的App&#xff0c;对于封号的App&#xff0c;给予剔除。虽然App数量减少了但是都是稳定的…

getopt函数和getopt_long函数

这个函数有点像无限迷宫&#xff0c;正确的路和错误的路都有很多&#xff0c;我们只需要能够满足当前需求就可以了&#xff0c;完全没有必要去探索每一条路。虽然&#xff0c;我很久以前试图这样干过。过滤后的回忆&#xff0c;只剩感觉了&#xff0c;过滤的多了&#xff0c;感…

阿里巴巴开源的Spring Cloud Alibaba手册在GitHub上火了

“微服务架构经验你有吗&#xff1f;” 前段时间一个朋友去面试&#xff0c;阿里面试官一句话问倒了他。实际上&#xff0c;不在BAT这样的大厂工作&#xff0c;是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得&#xff0c;让各个大厂都抢着要这样的人才&#x…

高校如何拿下数据分类分级这道“题”? 建设方案与实践来了

数据安全若一场“大考”&#xff0c;数据分类分级绝对是道“必答题”。 对高校而言&#xff0c;同样如此。作为高层次人才培养与科学研究的重要基地&#xff0c;高校既拥有高价值的科研等敏感数据&#xff0c;又涉及大量师生个人信息&#xff0c;无论是开展数据战略还是数据安全…

35岁以上的测试人员有多少?

今天在某论坛上看到一个有意思的问题&#xff1a;35岁以上的测试人员有多少&#xff1f; 细细一琢磨&#xff0c;为什么这位朋友会有这样的疑问呢&#xff1f;根据提问者的年龄划分&#xff0c;有以下两种可能&#xff1a; 35岁以下的提问者&#xff1a;想了解下35岁是否真如…

第八章 Electron 实现音乐播放器之爬虫播放音乐

一、介绍 &#x1f680; ✈️ &#x1f681; &#x1f682; 我在第五章已经有一篇Electron爬虫的文章&#xff0c;主要写的爬取图片资源的案例。这篇开始讲解如何到一个音乐网站爬取音乐资源&#xff0c;并且进行在线播放&#xff0c;下载等等。 那么什么是爬虫呢。百度百科上…

今日小课堂:怎么翻译音频

想象一下&#xff0c;你正在与外国朋友聊天&#xff0c;但是你们之间有语言障碍。不用担心&#xff01;现在有许多翻译语音识别工具可以帮助你轻松应对这种情况。通过这些工具&#xff0c;你可以将语音转换为文字&#xff0c;然后再将其翻译成你所需的语言。接下来&#xff0c;…

会声会影2023中文版本V26.0.0.136

会声会影2023中文版是一款功能强大的视频编辑软件、大型视频制作软件、专业视频剪辑软件。会声会影专业视频编辑处理软件&#xff0c;可以用于剪辑合并视频&#xff0c;制作视频&#xff0c;屏幕录制&#xff0c;光盘制作&#xff0c;视频后期编辑、添加特效、字幕和配音等操作…

爬虫一定要用代理IP吗,不用行不行

目录 1、爬虫一定要用代理IP吗 2、爬虫为什么要用代理IP 3、爬虫怎么使用代理IP 4、爬虫使用代理IP的注意事项 1、爬虫一定要用代理IP吗 很多人觉得&#xff0c;爬虫一定要使用代理IP&#xff0c;否则将寸步难行。但事实上&#xff0c;很多小爬虫不需要使用代理IP照样工作…

【TA100】3.4 前向/延迟渲染管线介绍

一、渲染路径 1.什么是渲染路径&#xff08;Rendering Path&#xff09; ● 是决定光照实现的方式。&#xff08;也就是当前渲染目标使用的光照流程&#xff09; 二、渲染方式 首先看一下两者的直观的不同 前向/正向渲染-Forward Rendering 一句话概括&#xff1a;每个光…

openpose原理以及各种细节的介绍

前言&#xff1a; OpenPose是一个基于深度学习的人体姿势估计库&#xff0c;它可以从图像或视频中准确地检测和估计人体的关键点和姿势信息。OpenPose的目标是将人体姿势估计变成一个实时、多人、准确的任务。——本节介绍openpose的原理部分 把关键点按照定义好的规则从上到下…

Matter实战系列-----5.matter设备证书烧录

一、安装工具 1.1 安装Commander_Linux工具 下载地址 https://www.silabs.com/documents/public/software/SimplicityCommander-Linux.zip 下载完之后解压缩&#xff0c;在压缩包内执行命令如下 tar jxvf Commander_linux_x86_64_1v15p0b1306.tar.bz cd ./commander ./co…

启动appium服务的2种方法(python脚本cmd窗口)

目录 前言&#xff1a; 1. 通过cmd窗口命令启动 1.1 启动单个appium服务 1.2 启动多个appium服务 2. 通过python脚本来启动 2.1 启动单个appium服务 2.2 启动多个appium服务 3. 启动校验 3.1 通过cmd命令查看 3.1.1 查看指定端口号 3.1.2 查看全部端口号 3.2 通过生…

华为笔记本怎么用U盘重装Win10系统?

华为笔记本怎么用U盘重装Win10系统&#xff1f;华为笔记本拥有指纹识别、背光键盘、信号增强等功能&#xff0c;带给用户超棒的操作体验&#xff0c;用户现在想用U盘来重装华为笔记本Win10系统&#xff0c;但不知道具体怎么操作&#xff0c;这时候用户就可以按照以下分享的华为…

CMAC算法介绍

文章目录 一、简介二、符号三、步骤3.1 子秘钥生成3.2 计算MAC值 一、简介 CMAC&#xff08;Cipher Block Chaining-Message Authentication Code&#xff09;&#xff0c;也简称为CBC_MAC&#xff0c;它是一种基于对称秘钥分组加密算法的消息认证码。由于其是基于“对称秘钥分…

网络安全|渗透测试入门学习,从零基础入门到精通—渗透中的开发语言

目录 前面的话 开发语言 1、html 解析 2、JavaScript 用法 3、JAVA 特性 4、PHP 作用 PHP 能做什么&#xff1f; 5、C/C 使用 如何学习 前面的话 关于在渗透中需要学习的语言第一点个人认为就是可以打一下HTML&#xff0c;JS那些基础知识&#xff0c;磨刀不误砍柴…

RTU遥测终端机的应用场景有哪些?

遥测终端机又称智能RTU遥测终端机&#xff0c;是一种用于采集、传输和处理遥测数据的设备。在现代科技的发展中&#xff0c;遥测终端机扮演着重要的角色。它是一种能够实现远程监测和控制的关键设备&#xff0c;广泛应用于各个领域&#xff0c;包括水文水利、环境监测、工业自动…

Linux系统:优化命令sar

目录 一、理论 1.命令描述 2.命令作用 3.命令参数 4.实用实例 二、实验 1.压力测试 三、问题 1.Linux系统五大负载如何解决 2.为什么使用ab命令进行网络传输数据的压力测试 3.ab命令发送请求测试失败 四、总结 1.sar命令 2.ab命令 3.五大负载 一、理论 1.命令描…

MySQL的索引(我把梦想卖了 换成了柴米油盐)

文章目录 一、索引的概念二、索引的作用如何实现&#xff1f; 三、索引的副作用四、创建索引的原则依据创建索引的依据 五、索引的分类六、索引的增删改查1.创建索引&#xff08;1&#xff09;创建普通索引&#xff08;2&#xff09;创建唯一索引&#xff08;3&#xff09;创建…