首页 > 编程语言 >Java设计模式—责任链模式(Chin of Responsibility)

Java设计模式—责任链模式(Chin of Responsibility)

时间:2024-08-08 18:52:11浏览次数:9  
标签:Java 请求 level 处理 LogLevel Chin message 设计模式 Logger

目录

引言

1. 职责链设计模式简介

1.1 定义

1.2 解决的问题

2. 设计模式的结构

2.1 类图

2.2 示例代码

3. 优点

4. 缺点

5. 实际应用

5.1 Spring AOP

5.2 Java Servlet Filter

5.3 Reactor Pattern

5.4 Java 中的日志记录库

6. 结论

注意事项


引言

在软件开发中,设计模式是一种经过验证的解决方案,用来解决常见的设计问题。职责链(Chain of Responsibility)模式就是一种这样的模式,它提供了一种优雅的方式来处理请求。本文将深入探讨职责链设计模式的定义、解决问题、优缺点、以及在一些大型应用程序中的实际应用。

1. 职责链设计模式简介

1.1 定义

职责链模式允许多个处理者(handlers)处理同一个请求,每个处理者都有机会处理这个请求。如果处理者不处理该请求,则它将请求传递给下一个处理者,直到请求被处理或到达链的末尾。这种模式有助于避免请求的发送者和接收者之间的耦合。

1.2 解决的问题

职责链模式通常用于以下情况:

  • 多个对象可以处理同一请求,但具体哪个对象处理该请求在运行时确定。
  • 系统需要动态指定一组对象处理请求的顺序。
  • 系统需要增加或修改处理一个请求的方式,而不需要改变客户端代码。

2. 设计模式的结构

2.1 类图

职责链模式的主要组成部分包括:

  • 抽象处理者(Handler):定义一个接口,用于处理请求,并且维护对下一个处理者的引用。
  • 具体处理者(Concrete Handler):实现抽象处理者定义的行为。每个具体处理者要么处理请求,要么将请求传递给下一个处理者。

2.2 示例代码

下面是一个简单的 Java 代码示例,演示了职责链模式的基本结构:

import jdk.jfr.internal.LogLevel;

//处理者接口
abstract class Logger {
    protected Logger nextLogger;

    public void setNextLogger(Logger nextLogger) {
        this.nextLogger = nextLogger;
    }

    public abstract void logMessage(LogLevel level, String message);
}
//具体的处理者类1
class ConsoleLogger extends Logger {
    public void logMessage(LogLevel level, String message) {
        if (level == LogLevel.INFO) {
            System.out.println("Console Logger: " + message);
        } else if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }
}
//具体的处理者类2
class FileLogger extends Logger {
    public void logMessage(LogLevel level, String message) {
        if (level == LogLevel.WARN || level == LogLevel.INFO) {
            System.out.println("File Logger: " + message);
        } else if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }
}
//具体的处理者类3
class ErrorLogger extends Logger {
    public void logMessage(LogLevel level, String message) {
        if (level == LogLevel.ERROR) {
            System.out.println("Error Logger: " + message);
        } else if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }
}

public class Chain {
    public static void main(String[] args) {
        Logger consoleLogger = new ConsoleLogger();
        Logger fileLogger = new FileLogger();
        Logger errorLogger = new ErrorLogger();

        consoleLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(errorLogger);

        consoleLogger.logMessage(LogLevel.INFO, "This is an information message.");
        consoleLogger.logMessage(LogLevel.WARN, "This is a warn message.");
        consoleLogger.logMessage(LogLevel.ERROR, "This is an error message.");
    }
}

3. 优点

  • 降低耦合度:处理者之间解耦,使得可以独立地增加新的处理者。
  • 灵活配置:可以根据不同的需求动态地重新配置处理者链。
  • 简化客户端代码:客户端只需要知道处理者链的起始位置,而不需要关心请求是如何被处理的。

4. 缺点

  • 潜在的复杂性:如果处理者链很长,那么调试和维护可能会变得复杂。
  • 性能影响:每个请求都必须沿着链传递,即使最终它被第一个处理者处理了。
  • 责任不清:对于特定的请求,可能不清楚哪个处理者会处理它。

5. 实际应用

5.1 Spring AOP

Spring AOP(Aspect-Oriented Programming)使用了职责链模式来实现切面(aspect)的拦截。在Spring框架中,每当一个方法被调用时,AOP框架会按照一定的顺序调用所有相关的切面。

5.2 Java Servlet Filter

Java Servlet 规范中使用了职责链模式来实现过滤器(Filter)。过滤器可以用来预处理请求和后处理响应,通常用于实现跨切关注点,如认证、授权、记录日志等。

5.3 Reactor Pattern

Reactor模式中,事件处理器形成了一个链,每一个处理器处理特定类型的事件,然后把控制权交给下一个处理器。

5.4 Java 中的日志记录库

许多 Java 日志记录库(例如,Log4j、Logback)使用责任链模式来处理日志消息。不同级别的日志消息会被传递给不同的日志处理器,然后按照配置的顺序进行处理。

6. 结论

职责链设计模式是一种强大的工具,它可以帮助我们构建灵活、可扩展的系统。通过减少耦合度并提供动态配置的能力,职责链模式成为了许多现代软件系统的关键部分。然而,在选择是否使用此模式时,也需要考虑到它的潜在缺点,确保它适合你的特定场景。


注意事项

  • 在使用职责链模式时,要确保链中的处理者数量不要过多,以免影响性能。
  • 考虑到可维护性,应当为每个处理者明确其职责范围。
  • 如果请求的处理逻辑比较复杂,考虑使用其他模式如策略模式作为补充。

标签:Java,请求,level,处理,LogLevel,Chin,message,设计模式,Logger
From: https://blog.csdn.net/weixin_43841461/article/details/140963607

相关文章

  • 电话号码转换 - 华为机试真题题解(Java)
    考试平台:时习知分值:200分(第二题)考试时间:两小时(共2题)题目描述将电话号码转换,需要实现如下的中英文电话号码转换:输入的字符串中每个数字对应为中文数字中的英文单词,如Double表示两个数字相同。将输入的中文数字字符串转换为英文单词的电话号码。若输入不合法,则输出......
  • 图片表格内容识别转换-II - 华为机试真题题解(Java)
    考试平台:时习知分值:200分考试时间:两小时(共2题)题目描述华为云推出了“通用表格识别”服务,可以将图片表格转换成文本数据。请你将文本数据进一步转换为“文本型表格”,如下图所示:输入现给出一个图片表格的文本数据:每行数据形如line3col1A,表示第3行第1列的单......
  • 【轻松拿捏】Java是如何实现跨平台性的?
    Java是如何实现跨平台性的?一、Java的跨平台性主要通过以下几个核心机制实现:二、具体实现三、示例 四、JVM工作示意图五、总结......
  • Java毕业设计 基于Springboot+Vue的电影院剧院订票选座管理系统(源码+lw+部署文档+讲
    文末获取资源,收藏关注不迷路文章目录项目介绍功能需求技术介绍项目界面关键代码目录项目介绍随着经济的发展和信息技术的普及,国内许多企业都面临了重大的挑战。企业的管理流程、战略规划如果不能进行调整,极有可能面临淘汰的风险。特别是郑州大剧院,面对大量的会员和......
  • "揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计"
    Centoschina项目要求爬取centoschina_cn的所有问题,包括文章标题和内容数据库表设计库表设计:数据展示:项目亮点低耦合,高内聚。爬虫专有settingscustom_settings=custom_settings_for_centoschina_cncustom_settings_for_centoschina_cn={'MYSQL_USER':'roo......
  • Java学习进程6
    大家好!这是我学习Java的第六周,今天我想和大家分享一下这一周我所做的事情、下周的计划、遇到的问题以及如何解决这些问题。本周学习内容在这一周,我继续深入学习Java语言的核心概念,特别是对面向对象编程(OOP)的理解。我复习了类和对象的定义,同时也对封装、继承和多态这三个重要概念......
  • 【Java基础】向下转型
    向下转型(Downcasting)在面向对象编程中是一种常见的类型转换操作,尤其在继承和多态的上下文中。为了用大白话解释这个概念,我们可以把它比作现实生活中的角色扮演。想象一下,你正在参加一场角色扮演游戏,游戏中有各种各样的角色,比如“玩家”、“战士”、“法师”和“盗贼”。在游戏......
  • 递归解决汉诺塔问题-个人见解(java)
    这里不提供题目汉诺塔问题是很多新手遇到的第一个难题,也许并不难,但是对于本人这种麻瓜来说第一次还是很难理解的,其中的思考过程一度让我崩溃不过也不是不能理解的,需要比较长的时间网络中有许多讲解视频,但是都大同小异,似乎都不是讲给麻瓜的,也可能是我们麻瓜太笨了,不过终究还是能......
  • 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for
    当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常:java.sql.SQLException:Nosuitabledriverfoundforjdbc:jdbc:nuuv://10.1.8.99:8832/xxoo比如有以下程序连接数据库测试:publicstaticvoidmain(String[]a......
  • Mac OS 批量将Java编码iso-8859-1( english_us8859)转换为utf-8格式
    !/bin/bash#指定源目录SOURCE_DIR="./serialMonitor"#遍历源目录下所有.java文件functionconvert_to_utf8(){localfile="$1"encoding=`file-I${file}|awk-F='{print$2}'`echo"encoding:$encoding"if[[&qu......