职责链(Chain of responsibility)模式

目录

  • 处理过程
  • 应用场景
  • 参与者
  • 协作
  • 效果
  • 实现
  • 相关模式
  • 应用与思考
  • 类图

职责链(Chain of responsibility)是一种对象行为模式,可以使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

处理过程

从第一个对象开始,链中收到请求的对象要么亲自处理他,要么转发给链中的下一个候选者。提交请求的对象并不明确知道哪一个对象将会处理它

应用场景

  • 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定
  • 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求
  • 可处理一个请求的对象集合应被动态指定

参与者

  • Handler:定义一个处理请求的接口
  • ConcreteHandler:
    • 处理它所负责的请求
    • 可访问它的后继者
    • 如果可处理该请求,就处理之;否则将该请求转发给它的后继者
  • Client:向链上的具体处理者对象提交请求

协作

当客户提交一个请求时,请求沿着传递链直至有一个ConcreteHandler对象负责处理它

效果

  • 降低耦合度:该模式使得一个对象无需知道哪一个对象处理其请求。职责链可简化对象间的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用
  • 增强了给对象指派职责的灵活性:可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。可以将这种机制与静态的特例化处理对象的继承机制结合起来使用——什么是静态的特例化处理对象的继承机制?
  • 不保证被接收和处理

实现

  • 实现后继者链,有两种方式实现后继者链:
    • 定义新链接,通常在Handler中定义,但也可由ConcreteHandlers来定义
    • 使用已有的链接,如在一个部分整体层次结构中,父构件应用可定义一个部件的后继者——待验证
  • 连接后继者:client中的handler变量需要指向第一个Concretehandler1的指针实例,ConcreteHandler1中需要保存ConcreteHandler2中的指针实例,以此类推
  • 表示请求:可以用硬编码,或者请求函数,封装请求对象等

相关模式

  • 与Composite一起使用,这种情况下一个构件的父构件可以作为它的后继——待验证

应用与思考

  • 在涉及到对请求或命令进行处理时可以采用职责链模式,这种场景下和状态模式有什么区别?
  • 如果不使用职责链模式,client中将使用大量的ConcreteHandler对象;使用职责链之后,只需要保存一个handler对象,但每个ConcreteHandler需要保存下一个ConcreteHandler对象

类图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ 容器 ] Docker 基本管理

目录 一、Docker 概述1.1 Docker 是什么?1.2 Docker 的宗旨1.3 容器的优点1.4 Docker 与 虚拟机的区别1.5 容器在内核中支持的两种技术namespace的六大类型 二、Docker核心概念2.1 镜像2.2 容器2.3 仓库 三、安装 Docker四、docker 镜像操作五、 Docker 容器操作总结…

js数组常用方法

js数组常用方法 join Array.join() 方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串。可以指定一个可选的字符串在生成的字符串中来分隔数组的各个元素。如果不指定分隔符,默认使用逗号。示例: var a [1,2,3] cons…

经济和行政手段使双高企业降低能耗总量和能耗强度,提高能源利用效率-安科瑞黄安南

摘要 2022年6月29日工信部、发改委、财政部、生态环境部、国资委、市场监管总局六部门联合下发《关于印发工业能效提升行动计划的通知》(工信部联节〔2022〕76号,以下简称《行动计划》),主要目的是为了提高工业领域能源利用效率&…

修复git diff正文中文乱码

Linux git diff正文中文乱码 在命令行下输入以下命令: $ git config --global core.quotepath false # 显示 status 编码 $ git config --global gui.encoding utf-8 # 图形界面编码 $ git config --global i18n.commit.encoding utf-8 # …

Ubuntu18.04 拯救者R9-7945HX 4060 配置ZED 2i代双目相机驱动+ORBSLAM2

AMD的拯救者网卡很拉,研究了很久除了换网卡可以解决网络问题,其它没找到合适的办法,这里我用手机USB共享网络的方式勉强上网,这里不得不说华为的信号桥很好用。 之前在1050ti的电脑上布置过,很顺利,这个新…

原生js实现将图片内容复制到剪贴板

核心代码 /*复制图片*/ copyImg(dom) {/* 警告:dom不能是img标签,建议用DIV标签包裹img标签,否者会报错!不支持复制背景图! */dom.style.userSelect auto;let selection getSelection(), range document.createRan…

Springboot调整接口响应返回时长详解(解决响应超时问题)

一、前言 当后端对于数据量较大的处理或是某些耗时的操作时,需要先对请求接口的请求进行响应。实际场景中会遇到请求业务处理流程耗时较长,比如长查询,远程调用等,主线程会被一直占用会影响其他请求的响应,导致服务端性能下降。同…

【Ubuntu报错】NetworkManager is not running

如果你在运行nmcli命令时遇到"NetworkManager is not running"错误,这意味着NetworkManager服务没有在你的系统上运行。 你可以尝试以下步骤来启动NetworkManager服务: 检查NetworkManager服务的状态:运行以下命令来检查NetworkMa…

Linux--系统调用接口:open

open的库函数&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>open的函数形式&#xff1a; int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode); flags:标志位 标志位选项…

大模型开发(五):实现Jupyter本地调用OpenAI API

全文共3000余字&#xff0c;预计阅读时间约15分钟 | 满满干货&#xff0c;建议收藏&#xff01; 大模型开发(五)&#xff1a;实现Jupyter本地调用OpenAI API OpenAI作为本轮大语言模型技术进步的先驱&#xff0c;其系列大型模型在效果上一直保持着领先。其推出的各类模型如文本…

springboot第30集:springboot集合问题

Logstash Logstash 是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据、格式化数据&#xff0c;然后将数据发送到es进行存储。 ElasticSearch Elasticsearch 是基于JSON的分布式搜索和分析引擎&#xff0c;是利用倒排索引实现的全文索引。 KibanaKibana 能够…

云原生环境 - 如何自定义容器hosts文件

背景 在虚拟机环境下,如果想要自定义hosts,可以直接修改/etc/hosts文件。 在云原生环境下,也有这样的需求,想给启动的容器添加自定义的hosts配置。比如 1、DNS配置以及其它选项不合理的时候,比如解析出的IP地址不正确 2、覆盖掉对主机名的解析或者添加对某些主机名的解析…

线程的创建以及使用(MFC/C/C++)

目录 一、创建线程的几种方法 1、使用POSIX线程库&#xff08;pthread)&#xff08;C&#xff09; 2、 使用Windows线程库&#xff08;Win32 API&#xff09;&#xff08;C&#xff09; 3、使用C11标准库 二、线程的应用&#xff08;常用实例&#xff0c;附上完整代码&…

如何搭建一个标准的测量系统

要搭建一个标准的测量系统,需要考虑以下几个方面: 确定测量目的和需求:首先需要明确测量的目的和需求,例如测量长度、重量、体积等。同时需要考虑测量的精度和误差范围,以及测量系统的适用范围和条件等。选择合适的传感器:根据测量目的和需求,选择合适的传感器类型,例如…

数字化时代,如何做好用户体验与应用性能管理​

引言 随着数字化时代的到来&#xff0c;各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务&#xff0c;这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责&#xff0c;且使用多种运维工具&#xff0c;因此&#xff0c;当…

Databend 开源周报第 102 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 为指定列创建 B…

极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析...

全文链接&#xff1a;http://tecdat.cn/?p24182 本文用 R 编程语言极值理论 (EVT) 以确定 10 只股票指数的风险价值&#xff08;和条件 VaR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 使用 Anderson-Darling 检验对 10 只股票的组合数据进行…

【文生图系列】stable diffusion webui 汉化(双语)教程

文章目录 安装双语插件下载json源文件设置双语 这篇博文记录于我成功安装双语插件之后&#xff0c;所以以下的示例页面均是双语。汉化教程分为三步&#xff0c;安装插件&#xff0c;JSON源文件下载和最后一步的双语设置。 安装双语插件 在扩展&#xff08;extensions&#xf…

k8s如何访问 pod 元数据

如何访问 pod 元数据 **我们在 pod 中运行容器的时候&#xff0c;是否也会有想要获取当前 pod 的环境信息呢&#xff1f;**咱们写的 yaml 清单写的很简单&#xff0c;实际上部署之后&#xff0c; k8s 会给我们补充在 yaml 清单中没有写的字段&#xff0c;那么我们的 pod 环境信…

数学建模-典型相关分析

上节回顾 论文&#xff1a;常州大学一等奖淡水养殖… 要进行 pearson 相关系数 画散点图、折线图看是否相关检验正态分布满足上述&#xff0c;利用pearson相关系数 刚开始推导不会没关系&#xff0c;会应用就行&#xff0c;推导过程略&#xff0c;之后学习了后续知识&#xff…