责任链模式:让请求处理更灵活

一、责任链模式的定义

责任链模式是一种设计模式,其核心思想是将请求的发送者和接收者解耦,使多个对象都有机会处理请求。这些对象连接成链,并沿链传递请求,直到有对象处理它。

二、生活实例类比

  1. 公司请假审批流程

在公司中,员工请假需要经过多个审批环节。从部门经理到人力资源部再到总经理,每个环节都是责任链中的一环。员工提交请假申请后,依次经过每个审批环节,直到最终得到批准或驳回。

  1. 医院就诊流程

在医院就诊时,患者需要经过挂号、就诊、检查、取药等多个环节。每个环节都有相应的医生或护士负责处理。患者提交就诊请求后,依次经过每个环节,直到完成整个就诊过程。

三、责任链模式的结构组件

  1. 抽象处理者(Handler):定义一个处理请求的接口,包含一个方法用于传递下一个处理者。

  2. 具体处理者(Concrete Handler):实现抽象处理者的接口,定义自己的处理逻辑和传递下一个处理者的方法。

  3. 客户端(Client):创建并组装责任链,将请求传递给第一个处理者。

四、代码示例

// 抽象处理者
abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }

    public abstract void handleRequest(String request);
}

// 具体处理者1:日志级别过滤
class LoggerFilterHandler extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.contains("ERROR")) {
            System.out.println("LoggerFilterHandler: 处理错误日志");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者2:权限验证
class PermissionCheckHandler extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.contains("admin")) {
            System.out.println("PermissionCheckHandler: 权限验证通过");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 客户端组装链
public class ChainDemo {
    public static void main(String[] args) {
        Handler loggerFilter = new LoggerFilterHandler();
        Handler permissionCheck = new PermissionCheckHandler();

        loggerFilter.setNextHandler(permissionCheck);

        loggerFilter.handleRequest("This is an ERROR message.");
        loggerFilter.handleRequest("This is a normal message.");
    }
}

五、优缺点

优点:

  1. 避免请求发送者与接收者的耦合。
  2. 动态组合处理者,提高系统的灵活性。
  3. 便于扩展新的处理器。

缺点:

  1. 处理器过多可能导致性能下降。
  2. 链的维护成本较高。

六、典型应用场景

  1. 日志系统:如java.util.logging.Logger的日志处理器链。
  2. 权限验证系统。
  3. 异常处理系统。
  4. 网络协议解析器。

七、源码分析与应用

  1. Java标准库中的责任链实现:java.util.logging.Logger的日志处理器链。

  2. 开源框架中的应用:

  • Netty的ChannelPipeline:用于管理客户端和服务器的Channel之间的消息传输和事件通知。
  • Spring的Interceptor链:用于拦截Controller方法执行过程中的请求和响应。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐