职责链模式

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 职责链模式

如有错误或有补充,以及任何改进的意见,请留下您的高见

概念

职责链模式(Chain of Responsibility Pattern)是设计模式中的一种,属于行为型模式。它常用于处理多级请求,请求可以在多个处理对象之间传递,直到找到一个处理对象处理该请求为止。

职责链模式定义了一个处理请求的对象链。每个对象都可以是请求的发送者和接收者,且每个对象都有权处理请求或将其转发给链中的下一个对象。客户端只需要将请求发送到链的头部即可,而无需关心具体哪个对象会处理该请求。

实现方式

定义职责类:每个职责类都实现同一个接口,并覆盖接口中的方法。

构建职责链:将这些职责类链接起来,形成一个链表。

客户端请求:客户端向链表中的第一个职责类发送请求。

请求传递:如果当前职责类不能处理该请求,它会将请求传递给链表中的下一个职责类。这个过程会一直持续到有职责类能够处理该请求为止。

返回结果:一旦有职责类处理了请求,它会将结果返回给客户端。

优缺点

优点

解耦:客户端与具体处理请求的职责类解耦,客户端只需知道如何发送请求,而无需关心哪个职责类会处理该请求。

灵活性:可以动态地增加或删除职责类,只需修改链表即可,无需修改客户端代码。

多态性:通过实现相同的接口,可以使用不同的职责类来处理相同的请求。

缺点

系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 可能不容易观察运行时的特征,有碍于除错。

示例

假设有一个日志系统,可以记录不同级别的日志。我们可以使用职责链模式来设计这个系统:

public class Demo {
    public static void main(String[] args) {
        LogHandlerChain logHandlerChain = new LogHandlerChain();
        logHandlerChain.log(2,"information1");
        logHandlerChain.log(3,"information2");
        logHandlerChain.log(1,"information3");
    }
}
abstract class LogHandler {
    // 不同的level代表不同的日志
    LogHandler next = null;
    // 写日志
    void log(int level, String message) {
    }
    // 日志链中下一个日志类
    void setNext(LogHandler next) {
    }
}
class ConsoleLogHandler extends LogHandler {
    @Override
    public void log(int level, String message) {
        if (level == 1) {
            System.out.println("ConsoleLogHandler:" + level + ": " + message);
        } else {
            next.log(level, message);
        }
    }
    @Override
    public void setNext(LogHandler next) {
        this.next = next;
    }
}
class FileLogHandler extends LogHandler {
    @Override
    public void log(int level, String message) {
        if (level == 2) {
            System.out.println("FileLogHandler:" + level + ": " + message);
        } else {
            next.log(level, message);
        }
    }
    @Override
    public void setNext(LogHandler next) {
        this.next = next;
    }
}
class OtherLogHandler extends LogHandler {
    @Override
    public void log(int level, String message) {
        System.out.println("OtherLogHandler:" + level + ": " + message);
    }
}
// 日志链
class LogHandlerChain {
    private ConsoleLogHandler consoleLogHandler;
    private FileLogHandler fileLogHandler;
    private OtherLogHandler otherLogHandler;
    public LogHandlerChain() {
        // 初始化日志类
        consoleLogHandler = new ConsoleLogHandler();
        fileLogHandler = new FileLogHandler();
        otherLogHandler = new OtherLogHandler();
        consoleLogHandler.setNext(fileLogHandler);
        fileLogHandler.setNext(otherLogHandler);
    }
    void log(int level, String message) {
        consoleLogHandler.log(level, message);
    }
}

image.gif

当需要记录日志时,只需将日志消息发送到链的头部:

这样,日志消息会在不同的处理器之间传递,直到找到一个能够处理该日志消息的处理器为止。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
设计模式
行为设计模式之职责链模式
行为设计模式之职责链模式
|
设计模式 缓存 Java
行为型设计模式08-职责链模式
行为型设计模式08-职责链模式
40 0
|
设计模式
设计模式——职责链模式
设计模式——职责链模式
|
设计模式 Java
JAVA设计模式16:职责链模式,轻松解耦发送者和接收者
JAVA设计模式16:职责链模式,轻松解耦发送者和接收者
167 0
|
设计模式 Java
设计模式~~~责任链模式(职责链模式)
设计模式~~~责任链模式(职责链模式)
74 0
|
设计模式
设计模式-职责链模式
设计模式-职责链模式
62 0
|
设计模式 存储
设计模式之职责链模式
设计模式之职责链模式
设计模式之职责链模式
|
设计模式 Java 程序员
设计模式轻松学【二五】职责链模式
有时候,出了某件事,我们去解决,找到A,结果A踢皮球,说这不关我的事,去找B解决,然后我们就去找B,结果B也说,这跟我没关系,快去找C,就这样,我们就被踢来踢去,这就是责任链模式的思想,在找到正确的人解决之前,我们被不断的踢给一个有一个人,职责链就是告诉我们类应该有自己的职责,不属于自己职责范围的就推给其他类。
154 0
设计模式轻松学【二五】职责链模式
|
设计模式 数据处理
我学会了,职责链模式
职责链模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
118 0
我学会了,职责链模式
|
设计模式 算法