跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

设计模式实战:责任链模式

责任链模式将多个处理对象连接成链,请求沿链传递直至被处理,有效解耦发送者与接收者。核心角色包括抽象处理者、具体处理者和客户端。适用于处理者不确定或需动态组合职责的场景,但需注意遍历性能及递归栈空间限制。

松间照月发布于 2016/12/17更新于 2026/6/116 浏览
设计模式实战:责任链模式

概述

责任链模式属于对象行为型模式。其核心思想是将多个处理对象串联成一条链,请求沿着这条链传递,直到链上的某个对象决定处理它。客户端在发出请求时,无需知道最终由谁处理,这使得系统能够动态调整职责分配而不影响调用方。

意图与结构

该模式的主要目的是解耦请求的发送者与接收者。通过构建一个处理链,请求会在链上流转,直到找到合适的处理节点。在实际场景中,请求可能会经过多次流转,直到被完全处理或到达链尾。

责任链模式主要包含三个角色:

  • Handler(抽象处理者):定义处理请求的接口,并持有后继者的引用。
  • ConcreteHandler(具体处理者):实现具体的处理逻辑。如果它能处理该请求则执行,否则将请求传递给后继者。
  • Client(客户端):负责构建责任链,并向链首提交请求。

代码实现

下面是一个基于 Java 的实现示例,展示了如何组装和处理请求。

抽象处理者

public abstract class Handler {
    protected Handler successor;

    public abstract void handleRequest();

    public Handler getSuccessor() {
        return successor;
    }

    /**
     * 设置后继的责任对象
     */
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
}

具体处理者

public class ConcreteHandler extends Handler {
    @Override
    public void handleRequest() {
        if (getSuccessor() != null) {
            System.out.println("放过请求");
            getSuccessor().handleRequest();
        }  {
            System.out.println();
        }
    }
}
else
"处理请求"

客户端

public class Client {
    public static void main(String[] args) {
        // 组装责任链
        Handler handler1 = new ConcreteHandler();
        Handler handler2 = new ConcreteHandler();
        handler1.setSuccessor(handler2);

        // 提交请求
        handler1.handleRequest();
    }
}

在这个例子中,客户端创建了两个处理者对象,并将第一个的下家指向第二个,而第二个没有下家。当请求从第一个处理者发起时,它会依次检查是否有后继者,从而决定是否继续传递。

适用场景

当你遇到以下情况时,可以考虑使用责任链模式:

  1. 动态确定处理者:具体的职责逻辑可以在运行时通过组装链条来灵活配置。
  2. 不确定具体处理者:将所有可能的处理者组成一条链,遍历过程中相当于向每个处理者提交了请求。即使不是最终处理者,也可以在审查过程中进行一些预处理或包装操作。
  3. 集合动态指定:类似于前两点,可以在客户端类中动态创建和组合所有可能的处理者。

潜在不足

虽然责任链模式很灵活,但也存在一些需要注意的地方:

  1. 性能问题:对于每一个请求都需要遍历整个职责链,如果链过长,会影响性能。
  2. 栈空间消耗:在 handleRequest() 方法中使用了递归调用,如果链非常深,可能会导致栈溢出。

目录

  1. 概述
  2. 意图与结构
  3. 代码实现
  4. 抽象处理者
  5. 具体处理者
  6. 客户端
  7. 适用场景
  8. 潜在不足
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 为何 glTF 与 GLB 格式成为标准化主资产的主流选择
  • JavaScript Proxy 代理机制与核心方法详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online