职责链(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 容器操作总结…

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

摘要 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…

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

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

springboot第30集:springboot集合问题

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

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

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

Databend 开源周报第 102 期

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

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

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

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

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

k8s如何访问 pod 元数据

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

数学建模-典型相关分析

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

❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)

✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…

Ubuntu 的安装及其设置

文章目录 安装 Ubuntu屏幕分辨率设置修改软件源服务器锁屏时间设置设置 dash跨系统拖拽复制文件的设置 安装 Ubuntu 首先安装 VMware 虚拟机,虚拟机的安装比较简单,一步步点击Next即可完成安装。 安装完成后启动虚拟机,点击创建新的虚拟机。…

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于ELM-Adaboost极限学…

模拟面试2

1.说一说ArrayList的实现原理? ArrayList底层基于数组实现,内部封装了Object类型的数组,实现了list接口,通过默认构造器创建容器时,该数组被初始化为一个空数组,首次添加数据时再将其初始化为容量为10的数组…

【个人笔记】linux的cd命令与目录结构理解

cd命令 cd(英文全拼:change directory)命令用于改变当前工作目录的命令,切换到指定的路径。 若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。 另外,~ 也表示为 home 目录 的…

three.js学习记录(基础)

前言: 页面渲染3D特效,可以从各种图表库(例如ECharts)中寻找各种适用的模版,也可以寻找第三方插件。。。 一直以来都对three.js充满向往,终于偷闲找了个借口学了起来 参考资料 Three.js – JavaScript 3D…