[设计模式]行为模式-责任链(C++描述)

设计模式—行为模式深度分析与实现【c++与golang】【万字总结】 设计模式系列文章之行为模式汇总,并且分析他们的原理以及场景。并且分别用c++与go语言进行举例实现。责任链模式、 命令模式、 中介者模式和观察者模式用于处理请求发送者和接收者之间的不同连接方式:1、责任链按照顺序将请求动态传递给一系列的潜在接收者, 直至其中一名接收者对请求进行处理。2、命令在发送者和请求者之间建立单向连接。3、中介者清除了发送者和请求者之间的直接连接, 强制它们通过一个中介对象进行间接沟通。4、观察者允许接收者动态地订阅或取消接收请求。桥接模式、 状态模式和策略模式。 阅读详情

 [设计模式]行为模式-责任链(C++描述)

second60 20180605

1. 责任链模式定义

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。

发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

 

即可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求。

2. 命令模式结构图

   

分析:

1. 抽象处理者Handler:定义出一个处理请求的接口。

2. 具体处理者ConcreteHandler: 具体处理者接到请求后,可以选择择将请求处理掉,或将请求传给下家。

3. 代码

class  Handle
{
public:
    Handle(){_succ = NULL;}
    Handle(Handle* succ){_succ = succ;}
    virtual ~Handle(){delete _succ;}
    virtual void HandleRequest() = 0;
    void SetSuccessor(Handle *succ){_succ = succ;}
    Handle *GetSuccessor(){return _succ;}
private:
    Handle* _succ;
};

class ConcreteHandleA: public  Handle
{
public:
    ConcreteHandleA(){}
    ~ConcreteHandleA(){}
    ConcreteHandleA(Handler* succ): Handle(succ){}
    void HandleRequest()
    {
        if(this->GetSuccessor() != 0)
        {
        this->GetSuccessor()->HandleRequest();
        }
        else
        {
            // doing
        }
    }
};

class ConcreteHandleB: public  Handle
{
public:
    ConcreteHandleB(){}
    ~ConcreteHandleB(){}
    ConcreteHandleB(Handler* succ):Handle(succ){}
    void HandleRequest()
    {
        if(this->GetSuccessor()!=0)
        {
            this->GetSuccessor()->HandleRequest();
        }
        else
        {
        // doing B
        }
    }
};

int main()
{
    Handle*  h1 = new  ConcreteHandlerA();
    Handle*  h2 = new  ConcreteHandlerB();
    h1->SetSuccessor(h2);
    h1->HandleRequest();
}

4 使用场景

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

3、可动态指定一组对象处理请求。

 

例子:

1. 客户端层级调用,每个层级可以定制自已的责任,然后调用时由监听的层级接收并处理

2. OA系统,请假流程,是一个责任链,先由组长审批,再经理,再HR等。中间审批的人,可自由定制。

3. 关于等级,工作流程等,都可使用。


5 优缺点

优点:

1. 降低耦合度。它将请求的发送者和接收者解耦。 请求的发送者完全不必知道该请求会被哪个应答对象处理,极大降低了系统的耦合性。

2. 简化了对象。使得对象不需要知道链的结构。

3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4. 增加新的请求处理类很方便。

 

缺点:

1. 不能保证请求一定被接收。

2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3. 可能不容易观察运行时的特征,有碍于除错。


6 总结

责任链模式,简单地说,就是一层一层往上报,层级间可处理,可不处理。在实际运用中,还是比较多场景可用。只要系统中涉及到层级和流程关系的,可以考虑下是否可以用责任链模式来处理。

 

突破编程_C++_设计模式(责任链模式) C++ 设计模式:责任链模式 阅读详情

相关推荐

23种设计模式-责任链(Chain of Responsibility)设计模式

软考中级-软件设计师 责任链设计模式

片言可决讼,半纸能缚龙 1538

C++之责任链(Chain of Responsibility)模式

0. 简介 对于责任链模式,其作为一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。这种处理方法类似包与包之间的调用的思路,只是其可以不在主程序中累赘的去申明一堆if else变量使得程序更加臃肿。 相比于创建设计模式的对整体架构进行的设计,和结构设计模式对对象的化繁为简的操作,作为行为设计模式,其需要我们对数据流能够充分的把握,来避免检查代码的混乱不堪。 而每次新增功能都会使其更加臃肿。 修改某个检查步骤有时会影响其他的检查

lovely_yoshino的博客 4862

责任链模式 C++ 实现

责任链模式 C++ 实现

C++ 设计模式之责任链模式

C++ 设计模式之责任链模式

L_qingting的博客 1493

UFS 3.1协议实战解析:从MIPI M-PHY到SCSI命令的完整链路拆解

本文深入解析UFS 3.1存储协议,从MIPI M-PHY物理层到SCSI命令层,完整拆解数据链路。通过分析协议栈三层架构(UIC、UTP、UCS),结合Wireshark抓包实战,详解UPIU数据包传输与SCSI命令封装,并探讨GEAR模式对性能与功耗的影响,为嵌入式存储开发与调试提供实用指南。

weixin_29207533的博客 419

为什么需要知识图谱?什么是知识图谱?——KG的前世今生

我的知乎专栏,对知识图谱感兴趣的朋友可以关注。标题的命名顺序可能让有的读者不太习惯。通常在介绍一个陌生事物的应用前,我们先给出其定义。之所以换个顺序,是为了不让读者一开始就接触比较冰冷生硬的概念刻板描述(后面我尽量用更具体、准确的例子来表达),另一方面也是为了通过现实生活中的例子自然的引入知识图谱的概念。希望通过这种方式加深读者的印象和理解。为了减轻读者理解的负担,我尽可能地避免引入过多的概念和技术

SimmerChan的专栏 8万+

【C++设计模式】第十三篇:责任链模式(Chain of Responsibility)

动态传递请求的处理流水线

JuicyActiveGilbert的博客 768

DDR4 硬件设计笔记

DDR4-DRAM是第四代支持双倍数据读取,支持随机位置存取的静态存储器。DDR4-DRAM的工作原理。DDR之T拓扑和Fly-by拓扑。DDR的硬件设计。DDR4 PCB设计要点介绍。DDR4之PCB走线间距的串扰评估。DDR4之内存通道(channel)和内存列(rank)。

qq_26815321的博客 1万+

C++设计模式(11):责任链模式

一、背景

Golden_Knight的博客 1025

EETI_eGTouch驱动移植及校准

一.环境 芯片:NXP IMX6Q 内核版本:4.1.15 uname:Linux myimx6ek314 4.1.15-myimx6-g5d588fa6-dirty #4 SMP PREEMPT Tue Nov 17 17:26:34 CST 2020 armv7l armv7l armv7l GNU/Linux 二.官方《EETI_eGTouch_Linux_Programming_Guide_v2.5l.pdf》文档勘误 HID_MULTITOUCH =Y or N(官方文档设置为M): 正确设置H

Garden的博客 4332

ssd训练自己的数据集

基于SSD实现目标检测(训练自己的数据集)

reset2021的博客 6803

【第21节】C++设计模式(行为模式)-Chain of Responsibility(责任链)模式

Chain of Responsibility 模式的最大优点在于它降低了系统的耦合性。请求的发送者无需知道具体的处理者,只需将请求传递给责任链中的第一个对象即可。这种设计模式非常适合以下场景:(1)多级处理:当请求需要经过多个对象处理时,可以使用责任链模式。(2)动态处理:可以在运行时动态地调整责任链中的处理对象。(3)解耦:请求的发送者和处理者之间完全解耦,系统更加灵活。

攻城狮7号的博客 1596

YOLOv11官方代码库与预训练模型下载:介绍Ultralytics官方GitHub及模型权重(yolov11n.pt, yolov11s.pt等)

本文介绍了Ultralytics官方GitHub仓库和YOLOv11预训练模型。Ultralytics仓库是YOLO系列算法的官方实现,包含YOLOv11最新代码、预训练模型、文档和工具。仓库采用清晰的代码结构和活跃的更新策略,支持全流程开发。YOLOv11提供了5种不同规模的模型变体(YOLOv11n/s/m/l/x),在精度、速度和模型大小间权衡,适用于从移动设备到高精度检测等不同场景。各模型在COCO数据集上预训练,可直接使用或微调,满足多样化应用需求。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 5824

C++设计模式行为模式———责任链模式

责链模式应用的一个请求可能有多个接收者(扮演处理者角色),但最后只有一个接收者会处理该请求。此时,请求的发送者和接收者之间是解耦的。换句话说,请求的发送者只需要将请求发送到链上,并不关心请求的处理细节以及请求的传递,也并不知道最终会被哪个接收者处理,这种灵活性可以更好地应对变化。

无敌岩雀的博客 1276

华为OD新系统机试真题 - API请求日志去重分析

华为OD新系统机试真题【API请求日志去重分析】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【API请求日志去重分析】

qq_45776114的博客 914

【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】

在 Lauterbach TRACE32 调试系统中,Snooper是一种特殊的监视工具,它能够在不中断处理器执行的情况下监视和记录特定内存地址的数据变化。这对于系统级调试、性能分析、数据流监视以及实时系统的问题追踪特别有用,尤其是在无法使用中断的情况下。当你设置了一个或多个Snooper时,TRACE32 硬件将不断地监视指定的内存地址,一旦发生了读写操作,就会将相关信息记录下来。这样你就可以看到某个地址的数据是什么时候以及如何被修改的,而不会影响目标系统的运行。

CodingCos的博客 2764

行为模式:设计模式中的行为模式详解

行为模式是设计模式的核心部分,专注于对象间的交互与职责分配,提升系统灵活性和可维护性。本文介绍了三种典型行为模式:观察者模式(一对多状态通知机制,适用于事件驱动系统)、策略模式(封装算法使其可互换,支持动态选择)和责任链模式(构建处理链解耦请求与处理者)。每种模式均配以C++示例代码,展示其实际应用场景和实现方式,如观察者模式的消息通知、策略模式的支付方式切换等。这些模式通过规范化对象协作方式,有效减少代码冗余,增强系统扩展性。

软件科学-郝学胜 804

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【c++设计模式16】行为模式1:责任链模式(Chain of Responsibility)

责任链模式(Chain of Responsibility Pattern)定义了一个抽象处理者(Handler)接口和多个具体处理者(Concrete Handler)类,每个具体处理者都包含对下一个处理者的引用。当请求发生时,从链的头部开始,依次向下传递,直到有一个具体处理者能够处理该请求为止。责任链模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求,而不用显式地指定接收者。

junxuezheng的博客 956

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 设计模式 十二:责任链模式 (读书 现代c++设计模式)

责任链模式的核心思想责任链模式允许将多个处理对象(Handler)链接成链,请求沿链传递,直到被某个处理对象处理。其核心是解耦请求发送者和接收者,支持动态调整处理逻辑。何时需要使用责任链模式?责任链模式的核心应用场景是动态组织多个对象处理同一请求多级处理逻辑请求需要经过多个处理者按顺序处理,且处理者的顺序或组合可能动态变化。示例:审批流程(员工→经理→CEO)、HTTP中间件链、异常处理链。解耦请求与处理者客户端无需知道具体由哪个对象处理请求,只需将请求提交到链的起点。

Duramentee的博客 2251

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

责任链模式【行为模式C++】

责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。责任链模式在实际开发中非常常用,它可以帮助我们简化代码结构,提高可维护性和可扩展性。使用责任链模式可以避免代码中出现大量的条件语句,同时也使得代码更加灵活,易于修改和扩展。

weixin_39775340的博客 1249

设计模式中的行为模式

本文系统解析了11种行为型设计模式的核心思想与典型应用。责任链模式适用于多级审批系统;命令模式支持撤销/重做操作;解释器模式处理语法解析;迭代器模式统一集合遍历;中介者模式简化对象交互;备忘录模式实现状态恢复;观察者模式建立发布订阅机制;状态模式将行为委托给状态对象;策略模式使算法可互换;模板方法定义算法骨架;访问者模式分离操作与对象结构。这些模式通过抽象行为和规范通信,有效解决了面向对象设计中的职责分配问题,广泛应用于现代框架如Spring、React等场景。理解其本质比记忆具体实现更重要。

追赶时代的博客 1067

设计模式——责任链模式

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

m0_66825548的博客 1631

设计模式之责任链模式

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。当请求到达链中的某个处理者时,该处理者会决定是处理这个请求还是将其传递给链中的下一个处理者。这样就形成了一条责任链,请求在这条链上依次传递,直到有一个处理者能够处理它为止。

FallingGod的博客 1321

责任链模式--行为模式

1、描述 责任链是一种行为设计模式,允许你将请求沿着处理者链进行发送,直至其中一个处理者对其进行处理。 该模式允许多个对象来对请求进行处理,而无需让发送者类与具体接受者类相耦合。链可在运行时由遵循标准处理者接口的任意处理者动态生成。 2、结构图 3、C++代码 ...

qu1993的博客 251

设计模式 - 行为模式

本文详细介绍了设计模式中行为模式这一分类:Strategy 模式,Command 模式,Visitor 模式,Observer 模式,Mediator 模式,State 模式,Memento 模式,Chain of Responsibility 模式,Iterator 模式,Interpreter 模式。 对于其中常用的部分笔者附上了实例代码以及使用过程中得到的体会,与之相对的,我们也会简要略过了一些不那么常用的设计模式。

weixin_41733034的博客 1307
上一篇: [设计模式]行为模式-访问者(C++描述)
下一篇: [设计模式]行为模式-迭代器(C++描述)
second60
博客等级 码龄9年 155粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值