设计模式笔记(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 模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。
  • 如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任
别再迷信Intel网卡了!用普通笔记本+TWINCAT3搭建EtherCAT主站的完整避坑实录 本文详细介绍了如何用普通笔记本和TWINCAT3搭建EtherCAT主站的完整避坑指南。通过破除必须使用Intel网卡的迷思,提供软件环境搭建、关键配置步骤、Wireshark抓包技巧及性能优化建议,帮助开发者低成本实现EtherCAT主站功能。 阅读详情

相关推荐

卡方分布的前世今生:一个统计概念的演化史

本文追溯了卡方分布从19世纪末的理论雏形到现代统计推断核心工具的发展历程。从Karl Pearson的数学奠基到Ronald Fisher的理论完善,卡方分布在医学研究、社会科学和机器学习等领域展现出广泛应用。文章通过代码示例和性质分析,揭示了这一统计概念如何持续推动数据科学创新。

weixin_29251567的博客 392

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

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

Lawrence的专栏 1256

AI 推理与服务(AI Inference and Serving)

AI 推理和服务是现代分布式系统中的重要组成部分。通过合理应用 AI 推理和服务的最佳实践,可以显著提高系统的智能性和用户体验。本章介绍了 AI 推理和服务的核心概念、最佳实践以及在分布式系统中的应用,希望这些内容能帮助您构建更智能、更高效的分布式系统。

蜗牛沐雨 1382

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

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

作物生长模型Oryza V3实战1:为什么要研究它

ORYZAV3是水稻生长模拟模型ORYZA2000的最新升级版本(3.5版),作为作物生长模型,它通过数学方法和计算机技术模拟水稻生长发育过程及其与环境条件的相互作用。主要功能包括:模拟不同条件下的水稻生长和产量形成、评估环境胁迫影响、分析土壤碳氮动态以及进行区域尺度模拟。国内应用广泛,科研机构用于气候变化影响评估、灌溉模式比较等研究,并开展参数敏感性分析和应用培训。使用流程分为六个步骤:确定输入参数(气象、土壤、作物三类)、参数校准、设置模拟环境、运行模型、分析结果(输出50个参数)和计算产量(穗干重×收

505

第02章:HSA-Runtime架构概览

摘要: 本章深入解析HSA Runtime的三层架构设计,包括公共API层(C语言接口)、核心实现层(C++业务逻辑)和驱动抽象层(硬件交互)。重点介绍了Runtime的核心组件(Agent、Queue、Signal、Memory)及其关系,以及初始化流程、配置选项和调试功能。通过学习,读者将掌握HSA Runtime的整体架构,为后续模块学习奠定基础。

图形/计算GPU的驱动与虚拟化技术分享园地 2928

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

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

imherer的博客 264

Vue2 - 详细实现网页 “开启录音并生成音频文件,上传到服务器效果“,浏览器录制外部音频调用麦克风并传到后端,兼容全部浏览器、支持 PC 网页或手机 H5 网页、可本地播放试听(详细示例运行代码)

vue,nuxt,uniapp,网页网站,麦克风,网页录音,MediaRecorder,浏览器录音,移动端h5网页,手机端录音,web网页录音,recorder-core官方文档,Recorder,非https怎么本地录音,录音报错失败,录音后怎么播放音频,如何获取录音mp3文件,解决一直不提示麦克风权限,小白详细教程,实时录音,调用浏览器麦克风录音,浏览器不兼容,wav,mp3,vue怎么实现网页录音呢,vue2网页录音并上传到服务器,web如何实现录制音频,vue网页录音,音频录制播放和上传服务器,vu

🏆 前端领域优质创作者 6004

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

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

学习笔记 233

图神经网络在金融风险传播分析中的应用

《图神经网络在金融风险传播分析中的应用》 摘要 本文旨在探讨图神经网络(Graph Neural Networks, GNN)在金融风险传播分析中的应用。首先,本文简要介绍了图神经网络的基本概念、发展历史以及其在各类应用场景中的重要性。接着,详细介绍了图神经网络的核心算法,包括图卷积神经网

AI天才研究院 1282

VTK在QT与非QT环境下使用的区别

VTK可以在QT框架内使用,也可以独立于QT使用,这两种使用方式在架构、交互和渲染方面有显著差异。

深之JohnChen的专栏 630

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

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

weixin_42138525的博客 345

5G/NR SSB学习总结

6.1 SSB概念 同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB),它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH三部分共同组成。 6.2 SSB特征 ...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 8万+

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

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

Felix_hyfy的博客 230

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

pscad IEEE标准系统搭建说明

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

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

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

cay22的专栏 1483

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

阿正的梦工坊 2478

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

模式定义 职责链模式(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、付费专栏及课程。

余额充值