设计模式14- Chain of Responsibility Method 责任链设计模式

设计模式14- Chain of Responsibility Method 责任链设计模式
1.定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式。它通过把请求从一个对象传到链条中的下一个对象的方式,直到请求被处理完毕,以实现解耦。

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它使得多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。该模式把这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2.内涵


核心角色:

  • Handler(抽象处理者): 定义一个处理请求的接口,并实现后续链的相关方法。
  • ConcreteHandler(具体处理者): 具体的处理者对象,处理它所负责的请求,并确定该请求是否需要传递给下一个处理者。
  • Client(请求发送者): 提出请求的客户端对象。


工作原理:

  • 客户端发送请求;
  • 请求沿着处理者链向下传递,直到有一个具体的处理者能够处理该请求;
  • 每个处理者决定是否处理该请求或将其传递给链中的下一个处理者;
  • 当请求被处理或到达链的末端而无人处理时,请求处理过程结束。

3.使用示例
#include <iostream>
#include <string>// Handler Interface
class AuthenticationHandler {
public:virtual voidsetNextHandler(AuthenticationHandler* handler)= 0;virtual void handleRequest(const std::string& request)= 0;
};// Concrete Handlers
class UsernamePasswordHandler: public AuthenticationHandler {
private:AuthenticationHandler* nextHandler;public:voidsetNextHandler(AuthenticationHandler* handler) override{nextHandler = handler;}void handleRequest(const std::string& request) override{if (request == "username_password") {std::cout << "Authenticated using username and ""password."<< std::endl;}else if (nextHandler != nullptr) {nextHandler>handleRequest(request);}else {std::cout << "Invalid authentication method."<< std::endl;}}
};class OAuthHandler : public AuthenticationHandler {
private:AuthenticationHandler* nextHandler;public:voidsetNextHandler(AuthenticationHandler* handler) override{nextHandler = handler;}void handleRequest(const std::string& request) override{if (request == "oauth_token") {std::cout << "Authenticated using OAuth token."<< std::endl;}else if (nextHandler != nullptr) {nextHandler>handleRequest(request);}else {std::cout << "Invalid authentication method."<< std::endl;}}
};// Client
int main()
{AuthenticationHandler* usernamePasswordHandler= new UsernamePasswordHandler();AuthenticationHandler* oauthHandler= new OAuthHandler();// Set up the chainusernamePasswordHandler>setNextHandler(oauthHandler);// Handling authentication requestsusernamePasswordHandler>handleRequest("oauth_token");usernamePasswordHandler>handleRequest("username_password");usernamePasswordHandler>handleRequest("invalid_method");delete usernamePasswordHandler;delete oauthHandler;return 0;
}

4.注意事项


使用责任链模式时需要注意以下几个方面:

1. 责任链的构造:
    需要确定责任链中各个处理者的顺序,并构建好责任链结构。顺序安排不当可能导致请求无法得到合适的处理。
    处理者之间的引用关系要合理,避免循环引用等问题。

2. 请求传递与终止:
    需要明确处理者何时应该处理请求,何时应该将请求传递给下一个处理者。
    应该有明确的终止条件,避免请求无休止地在责任链中传递下去。

3. 处理者的实现:
    每个处理者需要实现自己的请求处理逻辑,并明确哪些请求可以处理,哪些需要传递。
    处理者需要合理使用前置/后置条件,避免处理能力过于集中或分散。

4. 性能问题:
    过长的责任链可能会影响性能,需要权衡责任链的长度。
    可以考虑使用缓存等技术优化责任链的性能。

5. 异常处理:
    需要考虑当某个处理者出现异常时,如何确保请求能被后续处理者正确处理。

6. 扩展性:
    责任链模式应该具有良好的扩展性,便于在不修改现有代码的情况下增加新的处理者。

总之,在使用责任链模式时,需要充分考虑责任链的构造、请求的传递与终止、各处理者的实现逻辑、性能问题、异常处理以及扩展性等方面,以确保模式的正确应用。


5.最佳实践

责任链模式的最佳实践,主要包括以下几个方面:

明确职责划分:
各个处理者需要清楚自己的职责范围,避免出现处理能力重叠或职责模糊的情况。
可以通过在抽象处理者中定义明确的职责划分规则来实现这一点。

动态组装责任链:
可以考虑使用工厂或者配置文件等方式,动态地组装责任链,提高灵活性。
这样可以在不修改代码的情况下,轻松地增加或删除处理者。

合理的链路长度:
过长的责任链可能会影响性能,因此需要权衡责任链的长度。
可以考虑使用缓存或其他优化技术来提高性能。


异常处理机制:
需要有完善的异常处理机制,确保当某个处理者出现异常时,请求能被正确地传递给下一个处理者。
可以在抽象处理者中定义统一的异常处理逻辑。


日志记录:
可以在处理者中记录日志信息,以便于追踪请求的处理过程和结果。
这有助于问题的诊断和系统的维护。

性能监控:
需要对责任链的性能进行监控,及时发现性能瓶颈,并采取相应的优化措施。

Web 服务器日志处理

每个处理者负责处理不同类型的日志,如访问日志、错误日志、安全日志等。
使用责任链模式可以灵活地添加或删除日志处理器,而不影响整体系统。
银行交易审批流程:

不同级别的员工负责审批不同金额的交易请求。
使用责任链模式可以方便地调整审批流程,增加或删除审批节点。
异常处理管理:

系统中出现各种异常,需要由不同的处理器进行处理。
使用责任链模式可以灵活地增加或修改异常处理逻辑,提高系统的可扩展性。

责任链模式体现在明确职责划分、动态组装责任链、合理的链路长度、异常处理机制、日志记录和性能监控等方面,可以广泛应用于各种需要灵活处理请求的场景中。

6.总结


总之,责任链模式通过创建一条处理者链,实现了请求发送者与请求处理者解耦,提高了系统的灵活性和可扩展性。


 

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

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

相关文章

weblogic 任意文件上传 CVE-2018-2894

一、漏洞简介 在 Weblogic Web Service Test Page 中存在一处任意文件上传漏洞&#xff0c; Web Service Test Page 在"生产模式"下默认不开启&#xff0c;所以该漏洞有一定限制。利用该 漏洞&#xff0c;可以上传任意 jsp 文件&#xff0c;进而获取服务器权限。 二…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

数据结构------二叉树经典习题1

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1判断相同的树 OJ链接 这道题相对简单,运用我们常规的递归写法就能轻松写出 所以我们解题思路应该这样想: 1.如果p为空&#xff0c;q为空&#xff0c;那么就是两颗空树肯定相等 2.如果一个树为空另一棵树不为空那么…

2024年,诺基亚手机发售仅一天就售罄

在智能手机越来越同质化的今天&#xff0c;各家都只卷性能和相机&#xff0c;大火的 AI 对于咱来说好像实用性又不太大&#xff0c;机圈属实整的有点儿无聊。 不过在阿红这两天上网冲浪的时候&#xff0c;一个陌生又熟悉的名字闯入了我的视线&#xff0c;——诺基亚&#xff08…

维护表空间中的数据文件

目录 向表空间中添加数据文件 从表空间中删除数据文件 删除users表空间中的users02.dbf数据文件 对数据文件的自动扩展设置 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 维护表空间中的数据文件主要包括向表空间中添…

深度学习中常见的九种交叉验证方法汇总

目录 1. K折交叉验证&#xff08;K-fold cross-validation&#xff09; 2. 分层K折交叉验证&#xff08;Stratified K-fold cross-validation&#xff09; 3. 时间序列交叉验证&#xff08;Time Series Split&#xff09; 4. 留一交叉验证&#xff08;Leave-One-Out Cross-…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

Java内存模式以及volatile关键字的使用

1.Java内存模型 &#xff08;1&#xff09;Java 内存模型&#xff08;Java Memory Model&#xff0c;简称 JMM&#xff09;&#xff0c;它是一个抽象的概念&#xff0c;JMM是和多线程相关的&#xff0c;它是一组规范&#xff0c;描述了一组规则&#xff0c;定义了多线程对共享…

“图生视频”技术创新:剪贴画秒变动画生成的实验验证与分析

在最近的研究进展中&#xff0c;AniClipart系统的问世标志着文本到视频生成技术的一个重要里程碑。这一系统由香港城市大学和莫纳什大学的研究者们共同开发&#xff0c;旨在解决将静态剪贴画图像根据文本提示自动转换成动画序列的挑战。传统的动画制作流程繁琐且耗时&#xff0…

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办&#xff…

用友GRP-U8 bx_dj_check.jsp SQL注入漏洞复现(XVE-2024-10537)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

NSSCTF | [SWPUCTF 2021 新生赛]babyrce

打开题目&#xff0c;显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…

传统FTP弊端显现 国产ftp要如何选择?

FTP&#xff08;File Transfer Protocol&#xff09;是一个用于在网络上的计算机之间传输文件的协议。它属于网络协议组的应用层&#xff0c;主要用于文件的上传、下载和文件管理操作&#xff0c;是一种比较通用、操作也比较简单的传输方式。不过随着国产化大浪潮的推进&#x…

【线性系统理论】笔记三

能控性判别 约当标准型 总结&#xff1a; 秩的判据 能观性判别 秩判据 能控Ⅰ型&能控Ⅱ型 1型 2型 能控性分解&能观型分解

vue+element 验证输入框是否包含特殊字符(赠送ip+域名双验证判断)

1 效果: 2 添加element自定义验证方法 rules{ dbConfig.address: [ { required: true, validator: validatehost_ip, trigger: blur } ] } 3 添加对应方法 var validatehost_ip (rule, value, callback) > {if (!value) {callback(new Error(地址不可为空))} else {//验…

OpenFeign替代品:Spring6 新增的http exchange 如何设置拦截器

前言 OpenFeign已经被认为是功能完备了&#xff0c;后续不再更新新功能&#xff0c;新出来的 http exchange 可以实现类似的功能。 在使用Openfeign的时候&#xff0c;我们通常会使用它的拦截器来实现认证token的填写等统一处理&#xff0c;那么&#xff0c;在使用Http exchan…

MY SQL 实验四:

一、实验目的 通过该实验掌握较复杂的SQL 查询数据库方法&#xff0c;包括嵌套查询&#xff0c;相关与不相关子查询&#xff0c;连接的多种方法等。 二、实验原理 数据库查询是数据库的核心操作。SQL语言提供了SELECT语句进行数据库的查询。 SELECT[ALL|DISTINCT]<目标列表达…

enable_shared_from_this 实现原理

前言 enable_shared_from_this 可以帮助我们用 this 指针安全地创建 shared_ptr。 enable_shared_from_this 假设我们的程序使用 shared_ptr 管理 Widget 对象&#xff0c;我们用一个 vector 来记录已经处理过的 Widget 对象&#xff1a; std::vector<std::shared_ptr&l…

OSError: [WinError 1455] 页面文件太小,无法完成操作 的问题

实质问题是报错&#xff1a;caffe2_detectron_ops.dll“ or one of its dependencies 还需要安装一个包&#xff1a; pip install intel-openmp 安装之后顺利测试通过。

使用可接受gitlab参数的插件配置webhook

jenkins配置 安装Generic Webhook Trigger 配置远程触发令牌 勾选Print post content和Print contributed variables用于打印值 配置gitlab 选择新增webhook 配置webhook http://JENKINS_URL/generic-webhook-trigger/invoke,将JENKINS_URL修改成自己的jenkins地址 先保存…