Chain of Responsibility:责任链模式

2023-11-18

      现有多个处理者。这些处理者可以处理不同的请求。这些处理者有等级关系,每个处理者都有更上级的处理者。对于最上级的处理者,可以没有上级。对于一个上级处理者,可以有多个下级处理者。

客户端发出了一个请求,请求被传递给一个最下级处理者。而该处理者无法处理该请求,于是将该请求发送给自己的上级。上级的处理者无法处理该请求,于是将该请求再度发往自己的上级……直到有某个处理者可以处理该请求。如果请求发送给最上级依然无法被处理,那么该请求就需要被抛出异常,或者有其他处理方式。

这一级一级的关系就像链条,故称之为责任链模式。

 

1.    定义请求

请求的定义是公开的,即必须为所有人可见,无论是客户还是处理者。

enum eRequest
{
	requestLevelA,
	requestLevelB,
	requestLevelC,
};
// 请求
class Request
{
public:
	eRequest _request;
};

2.    定义处理者基类

处理者基类规定了处理者的接口。

同时每个处理者存有上级的指针,当自身无法处理某个请求时,将该请求提交给自己的上级。

// 处理者
class Manager
{
public:
	//设置直接上级
	void setSuperior(Manager* superior) { _superior = superior; }
	//要求处理请求
	virtual void askForRequest(Request* request) = 0;
protected:
	Manager* _superior;
};

3.    定义处理者派生类

处理者派生类在请求处理函数中会对请求进行分析。若请求自身可以进行处理,那么处理;否则提交给自己的上级。

// 团队队长
class TeamLeader : public Manager
{
public:
	virtual void askForRequest(Request* request)
	{
		if (request->_request == requestLevelA)
		{
			处理请求
		}
		else
		{
			_superior->askForRequest(request);
		}
	};
};

// 总监
class Majordomo : public Manager
{
public:
	virtual void askForRequest(Request* request)
	{
		if (request->_request == requestLevelB)
		{
			处理请求
		}
		else
		{
			_superior->askForRequest(request);
		}
	};
};

// 老板
class Boss : public Manager
{
public:
	// 老板可以处理所有请求
	virtual void askForRequest(Request* request)
	{
		处理请求
	}
};

4.    用户使用

用户产生一个请求,然后将该请求提交给最低级的处理者即可。无论用户产生什么样的请求,都是如此。

void main()
{
	Manager* leader = new TeamLeader();
	Manager* major = new Majordomo();
	Boss* boss = new Boss();
	leader->setSuperior(major);
	major->setSuperior(boss);

	Request* rq = new Request();

	rq->_request = requestLevelA;
	leader->askForRequest(rq);

	rq->_request = requestLevelB;
	leader->askForRequest(rq);

	rq->_request = requestLevelC;
	leader->askForRequest(rq);
}
 

    责任链模式,一定要注意请求的配置,务必确保每一个请求都有某个级别的处理者可以进行处理。否则,当责任链走完,很可能请求没有被处理,那么就只能抛出异常,或使用通用的请求处理。

    一个责任链,可以是一条线,一棵树,或者一个环。对于环形的责任链,不存在最上级。这种情况下,请求必须可以被某个处理者处理,否则会死循环。

    下图是一个树形的责任链:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chain of Responsibility:责任链模式 的相关文章

随机推荐

  • 记录移动开发初探——用uniApp+sqlite仿XyKey实现密码管理记事本

    写在前面 最近刚准备上手移动开发 本着想要多端可用的原则 了解到了uniApp 大致扫完一遍文档 基本可以算是vue 微信小程序原生 对我来说基本0难度可直接进入开发 因此想着索性做一款简单的app来做更加深入的了解 就在这时候 朋友给我推
  • 在vscode中做实验出现的bug......

    1 python如何调用opencv中的saliency模块 如果你已经安装了opencv python的库 但是调用cv2 saliency方法时出现了如下的报错 module cv2 saliency has no attribute
  • (数据库链接池)spring内容复习7月16日笔记

    2023 07 16数据库连接池 数据库连接池是个容器 负责分配 管理数据库连接对象 Connection 它允许应用程序重复使用一个现有的数据库链接 而不是在重新建立一个 而且释放空闲时间超过最大空闲时间的链接 来避免因为没有释放链接而引
  • unity 设置image透明度_Unity透明效果-透明度测试

    在之前的记录中已经知道了透明度测试的原理 本节主要就在Unity中通过透明度测试实现透明效果进行实践 原理回顾 透明度测试采用一种 非舍即留 的机制 即 若某片元的透明度不满足条件 通常小于某个阈值 则舍弃 否则就按照不透明物体去处理 也就
  • unity 多人同屏处理

    一 把fbx的Optimize GameObject勾选上 会优化你模块的面数 不过好像有可能会引起别的问题 优化后和代码上的mesh数据对不上造成bug 二 由于每个sinnedmesh会产生一个drawcall 所以多人同屏时就会卡 针
  • SED系列教程

    1 易百 Sed教程 http www yiibai com sed sed branches html
  • vi指令的基本使用

    一 vi的基本概念 基本上vi可以分为三种状态 分别是命令模式 command mode 插入模式 Insert mode 和底行模式 last line mode 各模式的功能区分如下 1 命令行模式command mode 控制屏幕光标
  • unexpected EOF while parsing是什么意思

    unexpected EOF while parsing 意思是在解析的过程中遇到了意外的文件结束符 这通常表示程序的代码有语法错误 导致程序无法正常运行 这个错误的具体原因可能有很多 比如 在字符串中使用了单引号或双引号 但没有正确地将它
  • Linux 搭建 JumpServer 堡垒机

    跳板机概述 跳板机就是一台服务器 开发或运维人员在维护过程中首先要统一登录到这台服务器 然后再登录到目标设备进行维护和操作 跳板机缺点 没有实现对运维人员操作行为的控制和审计 使用跳板机的过程中还是会出现误操作 违规操作导致的事故 一旦出现
  • python下载文件暂停恢复_新技能 get —— Python 断点续传下载文件

    原博文 2017 03 24 12 44 from urllib request import urlretrieve import sys import os prev reported download percent None 首先定
  • Java复习-25-单例设计模式

    单例设计模式 目的 使用场景 在实际开发下 会存在一种情况 某一种类在程序的整个生命周期中 只需要实例化一次就足够了 例如 系统数据类 由于操作系统只有一个 因此在程序初始化时该类只需要实例化一次 之后的系统数据更改都是在这一个实例化对象中
  • sha256是什么算法,sha256的安全性,sha256算法详解

    一些朋友对密码学方面的知识不是很了解 什么sha1 sha256 sha512等等 这么多算法类似的算法可能会有一点混淆 尤其是对sha256不是很理解 本文整合了一些关于sha256的相关资料 针对sha256是什么算法 它的安全性如何
  • SSM商城项目实战:订单管理

    SSM商城项目实战 订单管理 在SSM商城项目中 订单管理是一个非常重要的功能模块 本文将详细介绍订单管理的实现思路和步骤代码 实现SSM商城项目中订单管理功能的思路如下 设计数据库表结构 根据订单管理的需求 设计订单表和订单明细表的结构
  • 5种IO流

    在 Unix网络编程 一书中提到了五种IO模型 分别是 阻塞IO 非阻塞IO 多路复用IO 信号驱动IO以及异步IO 下面就分别来介绍一下这5种IO模型的异同 1 阻塞IO模型 最传统的一种IO模型 即在读写数据过程中会发生阻塞现象 当用户
  • QuickHit小游戏代码实现

    首先先明确下这个小游戏的需求 1 根据输入速率和正确率将玩家分为不同级别 2 级别越高 一次显示的字符数越多 玩家正确输入一次的得分也越高 3 规定时间内完成规定次数的输入 正确率达到规定要求 则升级 玩家最高级别为6级 初始级别一律为1级
  • 4年.Net程序员转Java学习笔记(1)为什么要转

    本人在一个普通二线城市 在大学期间为通信工程专业 上课学的C 通过看师兄师姐留下来的视频以及百度自学了C 在学校里做了一些winForm项目 XXX管理系统 很水 BUG多 纯粹是自己做来玩的 界面设计 数据库 后端都是自己设计 毕业工作后
  • 层叠上下文-《CSS 世界》阅读笔记

    层叠规则 目录 层叠规则 目录 z index 什么是层叠上下文 什么是层叠水平 层叠顺序 层叠准则 层叠上下文的特性 笔者个人理解 层叠上下文的创建 定位元素与传统层叠上下文 层叠上下文与层叠顺序 z index 负值深入理解 z ind
  • Ajax-发送请求的五个步骤

    概述 Asynchronous Javascript And XML AJAX 不是一门的新的语言 而是对现有技术的综合利用 ajax 是一种技术方案 依赖浏览器提供的 XMLHttpRequest 对象发出 HTTP 请求和接收 HTTP
  • python学习笔记(1)之如何在python3.x下安装PIL、numpy以及matplotlib

    本人是大菜鸟一枚 也是第一次动手写博客 希望能够通过写博客总结自己学到的知识 同时得到与大牛们交流的机会 本人所写的内容仅是自己的一点学习总结 若有不对的地方 欢迎大家的批评指正 安装python3 5 2 python3 5 x的下载路径
  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法