责任链模式 行为型设计模式之十

1.背景

        当一个请求需要经过多个节点的处理,如果不考虑任何模式,每个对象要根据是否符合条件来决定是不是自己处理,这样就要使用if-else去处理。确定了类似A->B->C->D的处理流程后就不能再修改(除非修改源代码),导致客户端无法定制处理流程。再者各个节点的处理流程集中在一个类中,违反了“单一职责原则”,将导致测试和维护难度加大;最后无法在运行时动态的增加、修改或者删除处理流程中的处理节点,灵活性缺失。

2.定义

        使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它为止。发送请求的客户端并不知道链上的哪个对象会处理这个请求,这使得系统在不影响客户端的情况下动态的组织和分配责任。

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

不纯的责任链模式
        在一个不纯的职责链模式中允许某个请求被一个具体处理者部分处理后再向下传递,或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求,而且一个请求可以最终不被任何处理者对象所接收。

注:在实际软件系统中,很少能找到纯的责任链模式,大多数情况是不纯的责任链模式。

3.组成结构

  1. Client(客户端):向处理者提交请求对象。
  2. Handler(抽象处理者):定义了一个处理请求的接口,设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。持有下一个抽象处理者的引用,通过该引用,处理者可以连成一条链。
  3. ConcreteHandler(具体处理者):抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。

4.示例代码


#include <iostream>
using namespace std;//抽象处理者
class Handler
{
public:Handler() { m_pNextHandler = NULL; }virtual ~Handler() {}//设置下一个处理者void SetNextHandler(Handler* successor) { m_pNextHandler = successor; }//处理请求virtual void HandleRequest(int days) = 0;
protected:Handler* m_pNextHandler;  // 后继者
};//具体处理者、主管
class Director :public Handler
{
public://处理请求virtual void HandleRequest(int days){if (days <= 1){cout << "我是主管,有权批准一天假,同意了!" << endl;}else{m_pNextHandler->HandleRequest(days);}}
};//具体处理者、经理
class Manager :public Handler
{
public://处理请求virtual void HandleRequest(int days){if (days <= 3){cout << "我是经理,有权批准三以下的假,同意了!" << endl;}else{m_pNextHandler->HandleRequest(days);}}
};//具体处理者、老板
class Boss :public Handler
{
public://处理请求virtual void HandleRequest(int days){if (days <= 7){cout << "我是老板,最多让你请7天假,同意了!" << endl;}else{cout << "你请的假事假太长了,不同意!" << endl;}}
};//场景
int main()
{Handler* director = new Director;Handler* manager = new Manager;Handler* boss = new Boss;//设置责任链director->SetNextHandler(manager);manager->SetNextHandler(boss);director->HandleRequest(1);director->HandleRequest(2);director->HandleRequest(5);director->HandleRequest(8);return 0;
}
/*结果:
我是主管,有权批准一天假,同意了!
我是经理,有权批准三以下的假,同意了
我是老板,最多让你请7天假,同意了!
你请的假事假太长了,不同意!
请按任意键继续. . .*/

引用

https://blog.csdn.net/Golden_Knight/article/details/103363616

C++之责任链(Chain of Responsibility)模式_c++ 责任链模式-CSDN博客

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

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

相关文章

开发工具:推荐几款非常漂亮的VScode主题

目录 Atom One Dark Theme Github Theme Night Owl Theme Night Owl JellyFish Theme Sublime Material Theme 深色 浅色 今天给大家推荐几款非常漂亮的VScode主题&#xff0c;值得收藏&#xff01; Atom One Dark Theme 它是市场上最好的深色主题之一。Atom 标志性的…

Java中关于Random()随机数的小细节

第一种&#xff1a;使用Random类&#xff1a; 拿整数为例&#xff0c;只有整型可以设置种子&#xff0c;nextInt(100)&#xff0c;返回一个0-99的随机整数&#xff0c;包括0&#xff0c;不包括100&#xff0c;那么如果我们想产生[min,max]这个区间的随机整数&#xff0c;可用通…

前端笔试题总结,带答案和解析(二)

前端笔试题总结&#xff0c;带答案和解析&#xff08;二&#xff09; 这个系列将持续更新前端笔试题一期十题&#xff0c;每五题做一个标题&#xff08;方便跳转&#xff09;&#xff0c;您可以一期一期阅读&#xff0c;也可以在点击汇总&#xff0c;一口气看完&#xff0c;如果…

C/C++学习 -- SHA-256算法

SHA-256算法概述 SHA-256代表"Secure Hash Algorithm 256-bit"&#xff0c;是一种安全的哈希算法&#xff0c;输出固定长度的256位&#xff08;32字节&#xff09;哈希值。SHA-256被广泛用于加密、数字签名、密码学以及区块链等领域&#xff0c;因为它提供了高度的安…

python多线程与多进程

多线程与多进程 一, 什么是进程, 什么是线程? ​ 进程: 运行中的程序. 每次我们执行一个程序, 咱们的操作系统对自动的为这个程序准备一些必要的资源(例如, 分配内存, 创建一个能够执行的线程. ) ​ 线程: 程序内, 可以直接被CPU调度的执行过程. 是操作系统能够进行运算调度…

详解Python的装饰器(多层语法糖、装饰器和装饰器修复技术及递归函数)

python中的装饰器(decorator)一般采用语法糖的形式&#xff0c;是一种语法格式。比如&#xff1a;classmethod&#xff0c;staticmethod&#xff0c;property&#xff0c;xxx.setter&#xff0c;wraps()&#xff0c;func_name等都是python中的装饰器。 装饰器&#xff0c;装饰的…

pytorch_神经网络构建2(数学原理)

文章目录 深层神经网络多分类深层网络反向传播算法优化算法动量算法Adam 算法 深层神经网络 分类基础理论: 交叉熵是信息论中用来衡量两个分布相似性的一种量化方式 之前讲述二分类的loss函数时我们使用公式-(y*log(y_)(1-y)*log(1-y_)进行概率计算 y表示真实值,y_表示预测值 …

深入探究HTML表单与JavaScript的关系

深入探究HTML表单与JavaScript的关系 引言 HTML表单是网页中数据收集的重要工具&#xff0c;而JavaScript则充当着这些数据的处理者和控制者的角色。二者之间的关系非常紧密&#xff0c;共同构成了现代Web应用中用户交互的基础。在这篇博客中&#xff0c;我们将详细地解析HTM…

【Pinia】小菠萝详细使用说明

文章目录 1. 介绍1.1 Pinia介绍1.2 pinia的属性说明 2. 安装3. 初步使用4. store具体使用4.1 值修改4.2.1 直接修改4.2.2 通过$patch整体修改4.2.3 通过$patch函数式4.2.4 通过$state整体修改4.2.5 通过actions修改 4.2 解构store 5 actions使用6. getters使用6.1 通过this获取…

Java Collection

Collection接口常用方法 ①添加&#xff1a; ​ add(Object obj):只要是对象都可以添加 ​ addAll(Collection c)&#xff1a;添加另一个集合的元素 ②删除&#xff1a; ​ clear():清空集合元素 ​ remove(Object obj)删除某个元素对象 ​ removeAll(Collection c)&…

熔断、限流、降级 —— SpringCloud Alibaba Sentinel

Sentinel 简介 Sentinel 是阿里中间件团队开源的&#xff0c;面向分布式服务架构的高可用流量防护组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性 Sentinel 提供了两个服务组件…

【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)

一&#xff0c;VMware下载地址&#xff1a; 百度网盘链接链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https:/…

初识jmeter及简单使用

目录 1、打开页面&#xff1a; 2、添加线程组&#xff1a; 3、线程组中设置参数&#xff1a; 4、添加请求 5、添加一个http请求后&#xff0c;设置请求内容 6、添加察看结果树 7、执行&#xff0c;查看结果 一般步骤是&#xff1a;在测试计划下面新建一个线程组&#xf…

postgresql-备份与恢复

postgresql-备份与恢复 基本概念备份类型物理备份与逻辑备份在线备份与离线备份全量备份与增量备份 备份恢复工具备份与恢复逻辑备份与还原备份单个数据库psqlpg_dumppg_store 备份整个集群 基本概念 服务器系统错误、硬件故障或者人为失误都可能导致数据的丢失或损坏。因此&am…

HTTP协议的不同版本及其新特性

HTTP/0.9 HTTP/0.9是最早的HTTP协议版本&#xff0c;于1991年发布。它具有以下特点&#xff1a; 只支持GET方法。不支持HTTP头部信息。响应只能是HTML文本。不支持状态码。 HTTP/1.0 HTTP/1.0于1996年发布&#xff0c;是HTTP协议的第一个正式版本。它具有以下特点&#xff…

一文全面解读CKA认证的含金量、详细介绍!

K8s是目前最流行的开源容器编排引擎&#xff0c;在全球都得到了广泛应用&#xff0c;BAT、京东、360、华为、网易、IBM、知乎等国内外诸多知名公司都在基于K8s构建企业容器云平台&#xff0c;支撑公司业务&#xff0c;越来越多的企业也都在向K8s迁移。相信在不远的将来&#xf…

日期相关工具类

日期相关工具类 【一】介绍【1】SimpleDateFormat 为什么是线程不安全【2】解决 SimpleDateFormat 线程不安全的方法 【二】LocalDate API【三】LocalTime API【四】LocalDateTime API【五】转换关系【1】LocalDateTime 与 LocalDate 之间的转换【2】LocalDateTime 与 Date 之间…

MySQL 索引类型和存储引擎详解

数据库索引是提高数据库查询性能的重要工具&#xff0c;而MySQL作为一个流行的关系型数据库管理系统&#xff0c;支持多种索引类型和存储引擎。在本文中&#xff0c;我们将深入探讨MySQL中的两种主要索引类型&#xff08;聚集索引和非聚集索引&#xff09;以及不同存储引擎&…

华为云云耀云服务器L实例评测|Elasticsearch的可视化Kibana工具安装 IK分词器的安装和使用

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的可视化Kibana工具安装&#xff0c;以及IK分词器的安装和使用。 其他相关的Elasticsea…

【2023最新】微信小程序中微信授权登录功能和退出登录功能实现讲解

文章目录 一、讲解视频二、小程序前端代码三、后端Java代码四、备注 一、讲解视频 教学视频地址&#xff1a; 视频地址 二、小程序前端代码 // pages/profile/profile.js import api from "../../utils/api"; import { myRequest } from "../../utils/reques…