第十五章、职责链模式

  • 第十五章、职责链模式

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。

  • 定义

1、行为型模式

行为型模式涉及到算法和对象间职责的分配

行为型模式不仅仅描述对象或类的模式,还描述他们之间的通信模式

(1)类行为型模式:使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。

(2)对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。

2、职责链模式

(1)模式定义

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

(2)注意:

在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。

请求在这条链上传递,直到链上的某一个对象处理此请求为止,也可能请求一直都得不到处理。

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

(3)分类

①纯的职责链模式:要求一个具体处理者对象只能在两个行为中选择一个:一个是承担责任,另一个是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;

②不纯的职责链模式:一个请求可以被部分处理后再传递给其他处理对象进行处理,

可以最终不被任何接收端对象所接收。

(4)模式分析

建链的位置

1、在客户端建链;

2、在Handler里面建链;

3、在各个职责对象里面建立其后续对象的引用。

建链的数据来源

1、在程序中动态组合数据;

2、通过数据库获得数据;

3、通过配置文件获取数据。

  • 结构图
  • 角色
  1. 抽象处理者(Handler):

(1)定义一个处理请求的接口,一般为抽象类

(2)在抽象处理者中定义了一个自类型(抽象处理者类型)的对象

它将作为对下一个处理者的引用,因每一个处理者的下家还是一个处理者所以通过该引用处理者可连成一条链。

(3)职责链模式的核心:抽象处理者类的设计

  1. 具体处理者(ConcreteHandler):
  1. 抽象处理者的子类,实现具体处理方法(实现抽象处理者中定义的抽象请求处理方法)。在处理前需要判断是否具有处理权限,如果拥有权限则处理,没有则转发到下一个处理者。
  2. 在具体处理者中可以访问链中的下一个对象,以便请求转发。

3、客户端(Client)

(1)创建责任链,并提出最初的请求(将请求发送到责任链的第一个处理者)。

注:客户端不需要知道责任链的具体结构,只需将请求发送给第一个处理者即可。

  • 模式实现
  1. 步骤

(1)定义抽象处理者:

①定义处理请求接口

②定义一个抽象处理者成员作为下一个处理者的引用,定义为protected。

(2)定义具体处理者:

处理/转发请求,实现处理请求的具体逻辑。

②每个具体处理者都需要包含一个指向下一个处理者的引用

处理请求前先判断是否具有权限拥有则处理请求,否则将请求传递给下一个处理者

(3)客户端创建职责链:

职责链模式并不创建职责链,职责链交由客户端创建,根据实际需要定义职责链顺序。

2、抽象处理者

拥有一个设置下一处理者的对象,可以通过setter注入,同时声明抽象处理方法。

2、具体处理者

继承抽象处理者,首先判断是否拥有权限处理(这里是一个简单的if判断),如果有就处理,没有的话通过protected对象,也就是转发给下一个处理者处理。

3客户端

五、实例

六、优点

1、降低耦合:

职责链模式使得一个对象无须知道是其他哪一个对象处理请求,对象仅需知道请求会被处理即可,接收者和发送者都没有对方明确信息,且链中对象不需要知道链的结构,由客户端负责链的创建,降低了系统耦合度

2、简化对象相互连接:

请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有候选处理者的引用,可简化对象的相互连接

  1. 灵活的职责链:

增强给对象指派职责的灵活性,增加修改新的请求处理类很方便

  1. 符合OCP:

系统增加一个新的具体处理者时无须修改源码,只需要客户端重建职责链,符合OCP

七、缺点

1、请求可能得不到处理:不能保证请求一定被接收。

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

3、死循环:如果职责链不当,可能会导致死循环调用

八、运用场景

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

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

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

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

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

相关文章

docker容器的安装以及用法

1、了解docker 1.1、docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现…

springboot450房屋租赁管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统房屋租赁管理系统信息管理难度大,容错率低&am…

案例分享|企查查的数据降本增效之路

分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…

5G -- 5G网络架构

5G组网场景 从4G到5G的网络演进: 1、UE -> 4G基站 -> 4G核心网 * 部署初中期,利用存量网络,引入5G基站,4G与5G基站并存 2、UE -> (4G基站、5G基站) -> 4G核心网 * 部署中后期,引入5G核心网&am…

28. 描述符

一、什么是描述符 如果一个类中有如下 3 个方法中的任意一个,那么这个类创建的对象,可以称为 描述符对象。 object.__get__(self, instance, ownerNone) object.__set__(self, instance, value) object.__delete__(self, instance)如果有另外一个类&…

CVE-2024-32709 WordPress —— Recall 插件存在 SQL 注入漏洞

漏洞描述 WordPress 是一款免费开源的内容管理系统,适用于各类网站,包括个人博客、电子商务系统、企业网站。其插件 WP-Recall 的 account 存在 SQL 注入漏洞,攻击者可以通过该漏洞获取数据库敏感信息。 WP-Recall 版本 <= 16.26.5 漏洞复现 搭建环境、安装插件、完成…

Flink CDC实时同步mysql数据

官方参考资料&#xff1a; https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化&#xff08;如插入、更新和删除操作&#xff09;的技术。Flink CDC…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

二、使用langchain搭建RAG:金融问答机器人--数据清洗和切片

选择金融领域的专业文档作为源文件 这里选择 《博金大模型挑战赛-金融千问14b数据集》&#xff0c;这个数据集包含若干公司的年报&#xff0c;我们将利用这个年报搭建金融问答机器人。 具体下载地址 这里 git clone https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_…

maven使用Dependency-Check来扫描安全漏洞

在现代软件开发中&#xff0c;使用开源库和第三方依赖项已成为常态。然而&#xff0c;这些依赖项可能包含已知的安全漏洞&#xff0c;给应用程序带来潜在的风险。为了解决这个问题&#xff0c;OWASP Dependency-Check 应运而生。本文将介绍 OWASP Dependency-Check 的功能、安装…

meta-llama/Llama-3.2-1B 微调记录

踩坑&#xff1a; 1.刚开始部署在自己的windows电脑上&#xff0c;semgrep不支持windows &#xff0c;然后就换了linux服务器 2.服务器没有梯子&#xff0c;huggingface无法访问&#xff0c;模型数据集无法下载 解决方法&#xff1a; 使用huggingface镜像网站下载模型&#xf…

双指针---有效三角形的个数

这里写自定义目录标题 题目链接 [有效三角形的个数](https://leetcode.cn/problems/valid-triangle-number/description/)问题分析代码解决执行用时 题目链接 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例…

《通信电子电路》入门手册

因为大学这门课好多同学理解不了这门课 于是考完试后花了两天时间整理了这份笔记&#xff0c;在这分享给完全没有学懂这门课的同学&#xff0c;也帮助“理解概念才能学得进去”的同学入门 笔记&#xff1a;通信电子电路 入门手册 —— flowus笔记 对应&#xff1a;《通信电子…

基于单片机的智能水表的设计

1总体设计 本次设计智能IC卡水表&#xff0c;在系统架构上设计如图2.1所示&#xff0c;由STM32F103单片机&#xff0c;YF-S401霍尔型传感器&#xff0c;RFID模块&#xff0c;OLED12864液晶,按键&#xff0c;继电器等构成&#xff0c;在功能上可以实现水流量的检测&#xff0c;…

LA2016逻辑分析仪使用笔记1:测量引脚、解析串口数据

今日尝试学习使用LA2016逻辑分析仪&#xff1a;测量引脚 解析串口数据&#xff1a; 目录 逻辑分析仪&#xff1a; 实验接线&#xff1a; 基础操作&#xff1a; 选择使用到的通道&#xff1a; 设置采样时间、采样频率&#xff1a; 设置电平标准&#xff1a; 解析串口数据、测量串…

[论文阅读]Universal and transferable adversarial attacks on aligned language models

Universal and transferable adversarial attacks on aligned language models http://arxiv.org/abs/2307.15043 图 1&#xff1a;Aligned LLMs 不是对抗性 Aligned。我们的攻击构建了一个单一的对抗性提示&#xff0c;该提示始终绕过最先进的商业模式&#xff08;包括 ChatG…

【C++】小乐乐求和题目分析n变量类型讨论

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;解题分析&#x1f4af;为什么 n 需要是 long long问题重点&#xff1a;中间计算水平上的数据类型不足的例子&#xff1a;正确解决&#xff1a;将 n 设…

计算机基础知识——数据结构与算法(一)(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数据结构与算法…

WebView通过@JavascriptInterface 调用原生方法

1. 创建 WebView 和设置 WebView 设置 在 XML 布局中添加 WebView 在activity_main.xml里创建一个WebView控件 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schem…

基于AI对话生成剧情AVG游戏

游戏开发这个领域&#xff0c;一直有较高的学习门槛。作为一个非专业的游戏爱好者&#xff0c;如果想要开发游戏&#xff0c;往往受制于游戏引擎的专业程度&#xff0c;难以完成复杂的游戏项目。 AI IDE的诞生&#xff0c;提供了另外的一种思路&#xff0c;即通过AI 生成项目及…