设计模式笔记(20)---职责链模式(行为型)

《C++20设计模式》学习笔记——第13章职责链模式 职责链模式是一种非常简单的设计模式,允许组件依次处理命令(或查询)。职责链最简单的实现只需要维护一个指针链。理论上,如果想快速删除链上的对象,也可以用普通的vector或者list来代替指针链。代理链的实现则更加复杂,它利用了中介者模式和观察者模式,允许通过事件(信号)处理查询,让每个订阅者在将查询值返回给用户之前对最初传递的值(它是贯穿整个链的单个引用)进行修改。 阅读详情

Gof定义

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

动机

在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。

职责链模式结构图如下:

2010-01-24_210605

代码实现:

/// <summary>
/// 抽象处理类
/// </summary>
public abstract class BaseHandler
{
    public BaseHandler(BaseHandler next)
    {
        this.Next = next;
    }
    public BaseHandler Next { get; set; }
    protected abstract bool CanHandleRequest(Request request);
    public virtual void HandleRequest(Request request)
    {
        if (Next != null)
        {
            this.Next.HandleRequest(request);
        }
    }
}
public class AHandler:BaseHandler
{
    public AHandler(BaseHandler next)
        : base(next)
    {
        
    }
    protected override bool CanHandleRequest(Request request)
    {
        return request.Name == "A";
    }
    public override void HandleRequest(Request request)
    {
        if (this.CanHandleRequest(request))
        {
            Console.WriteLine("处理A的请求");
        }
        else
        {
            base.HandleRequest(request);
        }
    }
}
public class BHandler : BaseHandler
{
    public BHandler(BaseHandler next)
        : base(next)
    {
      
    }
    protected override bool CanHandleRequest(Request request)
    {
        return request.Name == "B";
    }
    public override void HandleRequest(Request request)
    {
        if (this.CanHandleRequest(request))
        {
            Console.WriteLine("处理B的请求");
        }
        else
        {
            base.HandleRequest(request);
        }
    }
}
public class CHandler : BaseHandler
{
    public CHandler(BaseHandler next)
        : base(next)
    {

    }
    protected override bool CanHandleRequest(Request request)
    {
        return request.Name == "C";
    }
    public override void HandleRequest(Request request)
    {
        if (this.CanHandleRequest(request))
        {
            Console.WriteLine("处理C的请求");
        }
        else
        {
            base.HandleRequest(request);
        }
    }
}
public class Sender
{
    public Request _request;
    public Sender(Request request)
    {
        this._request = request;
    }
    public void Process(BaseHandler handler)
    {
        handler.HandleRequest(_request);
    }
}
/// <summary>
/// 请求的信息类
/// </summary>
public class Request 
{ 
    public string Name { get; set; }
    public Request(string name)
    {
        this.Name = name;
    }
}
/// <summary>
/// 客户端程序
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        Sender sender = new Sender(new Request("A"));
        BaseHandler handler1 = new AHandler(null);
        BaseHandler handler2 = new BHandler(handler1);
        BaseHandler handler3 = new CHandler(handler2);
        sender.Process(handler3);
    }
}

 

Chain of Responsibility模式的几个要点

  • Chain of Responsibility 模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,只有这时候请求发送者与接受者的耦合才有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化。
  • 应用了Chain of Responsibility 模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
  • 如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任
从CST到AD:高效PCB阵列设计与介质优化实战 本文详细解析了从CST电磁仿真软件到Altium Designer(AD)的PCB阵列设计全流程,重点解决毫米波天线等精密设计中模型导出、介质优化和阵列构建的核心难题。通过实战技巧,指导工程师高效处理DXF文件导入、复杂铜皮填充、空气介质实现等关键步骤,确保高精度设计从仿真到制造的顺利转换,提升工作效率与设计可靠性。 阅读详情

相关推荐

3步搞定专利数据爬取:用Selenium绕过国家知识产权局反爬(附完整代码)

本文详细介绍了3种高效获取专利数据的技术方案,重点解析了使用Selenium绕过国家知识产权局反爬的实战方法,并提供了完整代码示例。文章还探讨了Requests+lxml轻量级方案和混合技术策略,帮助开发者根据需求选择最佳数据爬取方案,特别适合需要专利统计数据的开发者参考。

weixin_29029995的博客 1112

C#面向对象设计模式纵横谈 学习笔记20 Chain of Responsibility职责链模式(行为型模式)

动机:在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少的带来请求发送者与接受者的紧耦合。必须是请求的发送者不需要指定具体的接受者,让请求的接受者自己在运行时决定来处理请求,从而使两者解藕。意图:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理为止。

Lawrence的专栏 1256

《哥谭神话-工程篇》02.Palantir的Ontology层(语义层) -企业操作系统的大脑

Ontology(语义层) 是Foundry 的核心层。Ontology 位于集成到 Foundry 中的数字资产(数据集和模型)之上,并将其连接到现实世界的对应物,从工厂、设备和产品等物理资产到客户订单或金融交易等概念。本篇将详细拆解Ontology(语义层)。

892

设计模式学习笔记(十六):职责链模式

1 概述 1.1 引言 1.2 定义 1.3 结构图 1.4 角色 2 典型实现 2.1 步骤 2.2 抽象处理者 2.3 具体处理者 3 实例 4 分类 4.1 纯的职责链模式 4.2 不纯的职责链模式 5 主要优点 6 主要缺点 7 适用场景 8 总结

氷泠 339

【HAL库-STM】智能温控按键小风扇【胎教级教学】

硬件设备:DHT11,0.96寸oled屏,二/三/四线风扇(不挑),面包板 、f10的精英板等等。当人在的风扇面前时可以自行控制风扇,不在面前时又想开风扇就让他温控自行开启,(在这里有一个想法就是加上蓝牙和wifi控制的功能能够远程遥控,这个如果做的再全一点就要自主研发是一个多功能app,这里没有做。针对这个dht11,我一开始是卡在了这个check函数里面,一直是我给完dht11低电平和高电平后,dht11不回复我低电平和高电平,这个不是我的问题,当时代码是没毛病的,这个点一直卡着我。吐血五天实现小成品

weixin_52451652的博客 1741

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 892

C#设计模式学习笔记:(20)职责链模式

本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用。 一、引言 今天我们要讲行为型设计模式的第八个模式--职责链模式。让我们看看现实生活中某公司采购流程的例子吧,理解起来可能更容易。某公司的规章制度 规定,采购原材料的总价在5万之内,只需要经理级别的人批准即可;采购总价大于5万小于10万的则需要财务经理进行批准;总价大于10万小于30万的 需要总经理批准;总价大于30万的则需要通过董事会会议...

imherer的博客 264

告别双系统!用Ventoy把Ubuntu 22.04装进U盘,打造你的随身开发环境(附保姆级避坑指南)

本文详细介绍了如何使用Ventoy将Ubuntu 22.04安装到U盘,打造便携式开发环境。通过即插即用的特性,开发者可以在任何x86电脑上快速启动完整的Ubuntu系统,无需配置双系统或虚拟机。文章提供了从硬件准备到系统优化的全流程指南,帮助用户高效创建随身开发环境。

weixin_31569671的博客 364

设计模式笔记————职责链模式

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 Handler类,定义一个处理请求的接口。 public abstract class Handler { protected Handler handler; public Handler(Handler handler) {...

学习笔记 233

Ansys Lumerical + HFSS + optiSLang 三剑客:手把手教你优化行波MZM调制器(附完整参数配置)

本文详细介绍了如何利用Ansys Lumerical、HFSS和optiSLang三款工具构建自动化协同设计流程,以优化行波马赫曾德尔调制器(TW-MZM)的性能。通过参数化仿真、流程集成与元模型技术,该方案能高效解决多物理场耦合挑战,实现调制带宽、驱动电压等多目标的全局优化,显著提升光子集成芯片的设计效率与性能潜力。

weixin_29251131的博客 586

YOLOv11的扩散模型去噪预处理-(在推理前对低质量图像进行增强)

摘要: 扩散模型与YOLOv11的结合有效提升了复杂场景下的目标检测性能。针对低质量图像(如噪声、低光照)导致YOLOv11特征提取退化的问题,研究提出了一种基于条件扩散模型的预处理方法。通过语义引导的渐进式去噪,在保留关键检测特征的同时,显著改善了图像质量。技术核心包括:1)利用YOLOv11浅层特征作为条件输入;2)交叉注意力机制实现任务感知去噪;3)知识蒸馏与潜空间扩散加速推理。实验表明,该方法使mAP50提升19%,在15步内达到传统百步去噪效果,平衡了精度与实时性需求,为鲁棒性目标检测提供了新思路

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

观察者模式与职责链模式的相同和不同_设计模式学习笔记(十六):职责链模式...

1 概述1.1 引言很多情况下,一个软件系统中可以处理某个请求的对象不知一个,比如采购单的审批,主任,副董事长,董事长,董事会都可以处理采购单,他们可以构成一条处理采购单的链式结构,采购单沿着这条链进行传递,这条链就叫职责链。职责链可以是一条直线,一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,...

weixin_42138525的博客 345

【视频】GStreamer+WebRTC(九):使用NVIDIA硬编解码

2)下载 GStreamer-bad 插件包源码注意要下载和 GStreamer版本对应的插件包3)下载NVIDIA硬编解码SDK最新的SDK下载地址注意 GStreamer 1.24.2 中调用的 NVIDIA Video_Codec_SDK 不是最新的,先使用下面的方法,查看gst-plugins-bad-1.24.2.tar.xz 对应的NVIDIA Video_Codec_SDK 的版本是多少。

郭老二 263

设计模式笔记—20_ChainOfResponsibility职责链模式

文章目录Chain of Responsibility是一种“数据结构”模式动机定义结构代码对比chainofresponsibility.cpp要点总结 Chain of Responsibility是一种“数据结构”模式 常常有一些组件在内部具有稳定的数据结构。如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定的数据结构封装在内部,在外部提供统一的接口,来实现与...

Felix_hyfy的博客 230

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[设计模式笔记]快速小结(三)---行为型模式1

三. 行为行模式 14. Chain Of Responsibility(职责链模式) 意图: 使多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止. 结构: 图16 说明: 有多少开端, 就有多少条责任链. http://blog.youkuaiyun.com/bagboy_taob

cay22的专栏 1483

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++设计模式(李建忠)笔记4(完结)

主要介绍Composite, Iterator, 职责链, Command, Visitor, Interpreter模式

阿正的梦工坊 2478

温度PID控制PLC程序

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

[学习笔记]设计模式-职责链模式

模式定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链 模式结构图 示例代码

青云的博客 127

23种设计模式学习 [20万字超长笔记] (下)

文章目录前言17、行为型模式概述(行为型模式的分类)18、模板方法模式(模板方法设计模式)详解18.1 模板方法模式的定义与特点18.2 模板方法模式的结构与实现18.2.1 模板方法模式的结构18.2.2 模板方法模式的实现18.3 模板方法模式的应用实例18.4 模板方法模式的应用场景18.5 模板方法模式的扩展18.6 我的模板方法实践19、策略模式(策略设计模式)详解19.1 策略模式的定义与特点19.2 策略模式的结构与实现19.2.1 策略模式的结构19.2.2 模式的实现19.3 策略模式的应

HN-XX-PYY的博客 2929

职责链模式

《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代码实现。 目录:设计模式 Github地址:DesignPattern 说明 定义:职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求...

shijiacheng的博客 196

《大话设计模式--职责链模式》笔记

1、职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 2、责任链模式结构图: 3、简单代码实现 Handler类,定义一个处理请示的接口。 public abstract class Handler { protected Handler...

qq_41790833的博客 173

九、设计模式

软件设计师备考,设计模式速背

m0_57809109的博客 1149

设计模式-笔记总结

设计模式概述(Design Patterns) 具体内容可访问:http://c.biancheng.net/view/1317.html 目录 设计模式概述(Design Patterns) 1、软件设计模式概述 2、GoF的23种设计模式 根据模式的目的来划分 根据模式的作用来划分 GOF的23种设计模式的功能 3、UML中的类图及类图之间的关系 4、开闭原则(Open Closed Principle) 5、里氏替换原则(Liskov Substitution Principle

Champion-Dai 816
上一篇: 设计模式笔记(19)---观察者模式(行为型)
下一篇: 设计模式笔记(21)---备忘录模式(行为型)
oec2003
博客等级 码龄20年 373粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值