行为型模式之责任链模式(Chain of Responsibility)

嵌入式软件面试常见问题及答案 干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新 阅读详情

责任链模式的思想是在建立“一条处理链”,使得链上的所有处理者都有机会进行处理。


责任链在内存中的形态是一层层的线程调用栈帧(线程帧frame存储在线程栈stack内),看上去就像一根常常的链条,通常并不知道链条上有多少个环(处理者),每个处理者负责的事情(责任)不同,他们自行判断是否可以处理,如果可以处理则自己处理(不传递到下一个),如果自己不能处理则传递给下一个处理者。

责任链模式的实现通常有一个抽象类,他模板化了处理机制(即:检查是否可以处理、可以则自己处理、不可以则传递给下一个、如果下一个为空则抛出异常等)

PS:责任链上一次都应该只有一个处理者能够处理,而不是每个处理者都依次处理一遍,当然这个没有技术要求,我们完全可以使用其变体实现多处理者处理、过滤器等效果。


责任链只是给他们处理的机会而已,而具体的处理者是否需要处理或是否有能力进行处理都由处理者自己控制,并且,自主控制是否传递到下一个链进行处理。


责任链模式使请求与对请求的处理松耦合,使得添加新的处理以及定制处理次序变简单清晰。

使用责任链模式可方便地实现可插拔的处理方式,另外,通过控制处理的过程,如在传递到下个处理器之前和之后作处理,可以实现请求前后的细粒度的控制。

可以将责任链模式与“模板方法模式”结合使用以约束将一个请求沿着处理链进行处理。


场景:web英语的请求处理过程中,对一个请求的处理包括:记录日志、协议处理、Servlet分发等等,也可以自定义新的处理器,

即处理方式是可插拔的,是用责任链模式非常合适。


设计:

示例代码:

package netty_ws;

interface HandlerChain {
    void setNext(HandlerChain next);
    HandlerChain getNext();

    /**
     * 这里可以 添加 处理需要的参数,如请求上下文:RequestContext
     *
     * void invoke(RequestContext rc);
     *
     */
    void invoke();
}
// 使用模板方法模式
abstract class AbstractHandlerChain implements HandlerChain {
    private HandlerChain next;

    public void setNext(HandlerChain next) {
        this.next = next;
    }
    public HandlerChain getNext() {
        return this.next;
    }
    public void invoke() {
        invokeMe();

        // 可添加 前置处理

        // 传递到下一个处理者
        if (getNext() != null) {
            getNext().invoke();
        }

        // 可添加 后置处理
    }
    // 需要子类实现
    protected abstract void invokeMe();
}
class ProtocolHandler extends AbstractHandlerChain {
    @Override
    protected void invokeMe() {
        System.out.println("处理协议...");
    }
}
class Logger extends AbstractHandlerChain {
    @Override
    protected void invokeMe() {
        if (new java.util.Random().nextBoolean()) {// todo: 自主判断是否需要记录日志
            System.out.println("需要记录日志,记录日志...");
        } else {
            System.out.println("不需要记录日志。");
        }
    }
}
class Dispatcher extends AbstractHandlerChain {
    @Override
    protected void invokeMe() {
        System.out.println("分派相应的Servlet处理...");
    }
}

/**
 * 测试:责任链
 */
public class Test {
    public static void main(String[] args) {
        HandlerChain protocolHandler = new ProtocolHandler();
        HandlerChain logger = new Logger();
        HandlerChain dispatcher = new Dispatcher();

        /**
         * 设置“链”上的处理次序,即:组装出一个“处理链”
         */
        protocolHandler.setNext(logger);
        logger.setNext(dispatcher);

        /**
         * 执行 第一个“链”,后面的链会自动被调用处理。
         */
        protocolHandler.invoke();
    }
}
输出:

处理协议...
需要记录日志,记录日志...
分派相应的Servlet处理...

PS:其实这并不是一个很合适的责任链模式代码示例,更像一个过滤器链,技术没有绝对,能解决问题就好,不过为了增加代码的可读性与可维护性,依然建议遵守不成文的“模式规定”。

Loki 分布式日志中心服务 分布式日志中心 Loki + Promtail + Grafana 阅读详情

相关推荐

必看!wechat-article-exporter:轻松批量下载公众号文章

微信搜索“”关注公众号。在信息爆炸的时代,我们每天都会接触到大量优秀的微信公众号文章。有时候,我们想要将这些精彩的内容保存下来,以便日后回顾或者分享给更多的人。然而,微信公众号并没有提供直接的批量下载功能,这给我们带来了不少困扰。今天,我要给大家分享一款非常实用的软件——wechat-article-exporter,它能够帮助我们轻松地批量下载微信公众号文章,让你不再为文章的保存而烦恼。

王乐平 技术博客 4353

Spring面试题

Spring面试题

我从不打没有准备的仗! 9705

Qt 插件开发 plugin 超详细 有源码

Qt 插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,插件就行硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护;插件主要面向接口编程,无需访问.lib文件,热插拔、利于团队开发。即使在程序运行时.dll不存在,也可以正常启动,只是相应插件功能无法正常使用而已;动态库需要访问.lib文件,而且在程序运行时必须保证.lib存在,否则无法正常启动;

q610098308的专栏 6546

行为型模式——责任链模式(Chain of Responsibility Pattern)

该模式避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 通过UML图理解,使用,再深入分析Log如何使用该模式。

qq_46658171的博客 1166

香橙派5玩转SATA SSD:一个被忽略的overlays配置项,让你的Ubuntu系统飞起来

本文详细介绍了如何在香橙派5上通过配置`overlays=ssd-sata`启用SATA SSD作为系统启动盘,大幅提升Ubuntu系统的性能。文章深入解析了设备树覆盖的工作原理,提供了完整的配置流程和性能优化建议,帮助开发者充分发挥香橙派5的硬件潜力。

weixin_30787531的博客 220

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2187

行为型模式:①责任链模式(Chain of Responsibility Pattern)

单一职责原则:每个处理者仅处理自身职责内的请求;开闭原则:新增处理者或调整链结构无需修改现有代码;依赖倒置原则:客户端依赖抽象处理者,不依赖具体处理者。

ada0_ada1的博客 1175

Android14 SystemUI如何实现下拉菜单栏高斯模糊背景效果(类似于毛玻璃效果)

我们都知道,从Android12起,下拉菜单栏控制中心都是黑色的,看起来非常不美观,而且国内的手机系统UI都做的比较美观,大部分的下拉菜单UI背景都是实现了高斯模糊效果,所以客户也会要求实现类似于这样的效果。在以前的Android项目中,实现下拉菜单栏的模糊背景就是通过截图的方式进行替换背景,而这种方式下拉菜单背景极易替换不了,就算是在各个地方都适配,还是有概率在复杂场景或者一些测试手法下出现背景是黑的情况,并且这种方式还比较影响性能,毕竟每次都要去截图一次,多做了额外的事。

热衷于Android Framework和系统APP的修改经验分享 1793

行为型模式:责任链模式(Chain of Responsibility Pattern)

一、设计模式的分类 (如果以前看过关于设计模式的分类的话,这部分可以忽略!) 经过很多大神的总结,目前Java中一共23种经典的设计模式! 按照目的,设计模式可以分为以下三种用途: 1.创建型模式:用来处理对象的创建过程 2.结构型模式:用来处理类或者对象的组合 3.行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述 创建型模式用来处理对象的创建

未来,你好! 801

Microsemi Libero使用技巧1——查看芯片资源占用情况

Microsemi Libero使用技巧——查看芯片资源占用情况 前言 与MCU不同,FPGA的资源主要包括:逻辑资源,IO资源,Flash大小,PLL资源,SoC硬核处理器资源等,其中逻辑资源和IO资源是我们主要关心的,本篇文章将介绍,如何通过Microsemi Libero IDE来查看工程的详细资源占用情况。 A2F200M3F的资源 以Microsemi SmartFusion系列A2F2...

whik1194的博客 5694

061、LQR(线性二次型调节器)控制基础

本文介绍了LQR(线性二次型调节器)控制在飞控系统中的应用。作者通过一次四旋翼炸机事故引出PID控制的局限性,详细讲解了LQR的数学原理、权重矩阵的物理意义以及实际工程实现方法。文章对比了LQR与PID的控制效果,指出LQR在鲁棒性方面的优势,同时也分析了其存在稳态误差等缺点。最后总结了LQR在飞控中的适用场景,建议将LQR与PID结合使用,并预告了下一章将讨论带积分项的LQI控制。全文包含具体案例、代码实现和调参经验,为飞控算法开发者提供了实用指导。

2401_88858637的博客 720

设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求沿着处理者链进行发送。每个处理者对象都有机会处理该请求,直到某个处理者决定处理该请求为止。这种模式的主要目的是避免请求的发送者和接收者之间的耦合关系,从而提高系统的可扩展性和灵活性。

JINGWHALE 1863

2.Vivado软件基础操作

在本章节,我们以一个简单的计数器实例,介绍FPGA开发软件Vivado的基础操作流程,计数器实例程序的设计,在本课程中先不同掌握,后续课程将针对verilog编程进行讲解。 打开Vivado软件,会看到如下的界面: 点击如下图所示的: 点击Next> 将这个地方,设置路径,注意路径必须是英文路径。且文件夹名称第一个字符不能为数字。所有路径的名称的字符数量不能超过144个符号。 点击Next> 点击Next> 点...

FPGA/MATLAB学习教程/源码/项目合作开发 4478

设计模式 - 行为型 - 责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为型设计模式,通过将多个处理对象连接成链,允许请求沿链传递直至被处理,实现请求发送者与接收者的解耦。该模式具有高扩展性和灵活性,适合多级审批、日志处理等场景。核心包括抽象处理者、具体处理者等角色,支持动态增删处理节点。优点在于低耦合和动态编排,但可能存在性能损耗。实际应用中可见于Servlet Filter、Spring Security等框架。需注意控制链长度,可通过配置文件管理处理顺序。

csdn_tom_168的博客 888

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

行为型设计模式(1)—— 责任链模式(Chain of Responsibility Pattern)

1.简介 经常听身边的同事说其在项目中用到了责任链模式,今天就来学习一下什么是责任链模式。 责任链模式(Chain of Responsibility)是设计模式的一种,属于行为型设计模式。 顾名思义,责任链模式为请求创建了一个链,请求在链上被处理。通常某个处理器如果不能处理该请求,那么它会把相同的请求传给链上的下一个处理器。 2.使用场景 如果一个请求需要经过多个处理步骤,多个处理步骤抽象成一条执行链,那么便可以使用责任链模式。责任链的使用场景一般有: (1)向多处理器提交一个请求,最终运行时只会有一个

Doublelv 的博客专栏。 847

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

设计模式-责任链模式(Chain of Responsibility Pattern)-行为型

定义: 使多个对象都有机会处理请求,从而避免请求者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 类型: 行为型 理解: 定义多个请求接收者,然后把他们连接成一条链,也就是每个接受者对象里都引用了下一个接收者对象 当发起一个请求时,链条的第一个接收者开始处理,如果它判断能够处理,则请求到此为止,如果不能处理,则传递给下一个接收者处理 直到有一个接收者处...

guangdeshishe的博客 215

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式 ~ 行为型模式 ~ 责任链模式 ~ Chain of Responsibility Pattern。

设计模式 ~ 行为型模式 ~ 责任链模式 ~ Chain of Responsibility Pattern。

lyfGeek的博客 220

【设计模式】行为型模式—责任链模式(Chain of Responsibility Pattern)(十五)

**责任链模式(Chain of Responsibility Pattern)是指将链中的每一个节点看作是一个对象,每个节点处理的请求均不同,且每个节点内部自动维护了一个下一个节点对象。当一个请求在链路的头部发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。** - 责任链模式通常会维护一个`单向链表`,将同一类请求的对象连成一条链,调用方只需要调用`头部节点`就可以了,所提交的请求会沿着`链传递`,由链上的对象逐个判断`是否有能力处理该请求`,如果能则处理,`如果不能则传递给链

墩墩分墩 443

行为型-责任链模式(Chain of Responsibility Pattern)

又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

babstyt的博客 577

C# 设计模式:第十三章 - 行为型模式 之 责任链模式(Chain of Responsibility Pattern)

这种模式通过创建一个处理者链来处理请求。每个处理者都可以处理请求,或者将请求传递给链上的下一个处理者。这种模式降低了请求发送者和接收者之间的耦合度,使得系统更加灵活和可扩展。

caifox的博客 1290

Java设计模式 —— 【行为型模式】责任链模式(Chain-of-responsibility Pattern) 详解

责任链模式又名职责链模式,它是一种对象行为的设计模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。职责链可以是一条直线、一个环链或者是一个树结构的一部分。

知唔猪的博客 1122

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象。 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求。 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在...

ElegantHedgehog的博客 177

【设计模式】行为型模式-责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理链传递,直到有对象处理它为止。

weixin_43510208的博客 477

十四、行为型 责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。日志抽象类 结果: 参考: https://www.runoob.com/design-pattern/design-pattern-intro.html...

逆流者的博客 261

【设计模式·行为型】责任链模式Chain Of Responsibility Pattern

目的 多个对象有可能处理某一请求时,为避免冲突,将这些对象连成一条链,并沿着该链传递该请求,直到有一个对象处理它为止 应用场景 (1)多个对象均可处理单个请求,并且在运行时自动确定处理该请求的具体对象 (2)动态确定处理单个请求的对象集合 (3)客户无须指定接受特定接收者,可向多个对象发送请求 构成 抽象处理者、具体处理者、客户 备注 责任链模式就是“推卸”责任模式,你的事情,在我这里能处理就处理,处理不了就推给其他对象 ...

深漂小码哥 425

【设计模式】【行为型模式(Behavioral Patterns)】之责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。每个处理者都可以处理请求,或者将其传递给链上的下一个处理者。这种模式使得多个对象都有机会处理请求,而无需提前指定具体的处理者。通过这种方式,可以减少请求发送者和接收者之间的耦合。

ido1ok的博客 864
上一篇: 创建型模式之建造者模式(Builder)
下一篇: 结构型模式之享元模式(Flyweight)
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值