设计模式(4)--对象行为(1)--职责链

news2024/11/24 14:28:32
1. 意图

    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

    将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2. 两种角色

    抽象处理者(Handler)、具体处理者(Concrete Handler)

3. 优点

    3.1 降低耦合度。简化了对象的相互连接,仅需保持一个指向后继者的引用。

    3.2 增强了给对象指派职责的灵活性。可以在运行时刻动态地增加或改变职责。

4. 缺点

    4.1 不保证请求一定被处理(没有相应的处理者或使用不当) 

5. 相关模式

    5.1 职责链常与组合一起使用。

6. 代码示意(C++)
#pragma once
#include <iostream>
#include <string>
using namespace std;

class Request
{
	int m_type;
	string m_content;
public:
	Request(int type, const string& content) :m_type(type), m_content(content) {

	}
	int GetType() { return m_type; }
	string GetContent() { return m_content; }
};
class Handler
{
	Handler* m_pNextHandler;
public:
	Handler(Handler* pNextHandler) {
		m_pNextHandler = pNextHandler;
	}
	virtual void HandleRequest(Request* pRequest) {
		if (0 != m_pNextHandler) {
			m_pNextHandler->HandleRequest(pRequest);
		}
		else {
			cout << "Not handled, request id:" << pRequest->GetType() << endl;
		}
	}
};

class ConcreteHandler1 :public Handler
{
public:
	ConcreteHandler1(Handler* pNextHandler) :Handler(pNextHandler) {

	}
	virtual void HandleRequest(Request* pRequest) {
		if (1 == pRequest->GetType()) {
			cout << "ConcreteHandler1 handled:" << pRequest->GetContent() << endl;
		}
		else {
			Handler::HandleRequest(pRequest);
		}
	}
};

class ConcreteHandler2 :public Handler
{
public:
	ConcreteHandler2(Handler* pNextHandler) :Handler(pNextHandler) {

	}
	virtual void HandleRequest(Request* pRequest) {
		if (2 == pRequest->GetType()) {
			cout << "ConcreteHandler2 handled:" << pRequest->GetContent() << endl;
		}
		else {
			Handler::HandleRequest(pRequest);
		}
	}
};
#include "Handler.h"
int main() {
	Handler* pHandler2 = new ConcreteHandler2(0);
	Handler* pHandler1 = new ConcreteHandler1(pHandler2);

	Request request1(1,"hello");
	Request request2(2, "hi");

	pHandler1->HandleRequest(&request1);
	pHandler1->HandleRequest(&request2);

	pHandler2->HandleRequest(&request1);

	delete pHandler1;
	delete pHandler2;
	return 0;
}

运行结果:

 6.1 每个具体处理者只需关注自己能处理的请求,其它请求丢给后继者(3.1)

 6.2 pHandler2只能处理一个请求,因为它在职责链的末端(4.1)

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

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

相关文章

直播怎么录制视频?轻松提升视频质量!

录制直播视频是保存和分享游戏过程、教程或其他在线活动的好方法。随着直播行业的兴起&#xff0c;许多用户都希望能够录制自己的直播内容以供日后观看或与他人分享。可是直播怎么录制视频呢&#xff1f;本文将详细介绍两种直播录制视频的方法&#xff0c;希望通过具体的步骤讲…

Redis-Day3实战篇-商户查询缓存(缓存的添加和更新, 缓存穿透/雪崩/击穿, 缓存工具封装)

Redis-Day3实战篇-商户查询缓存 什么是缓存添加Redis缓存业务流程项目实现练习 - 给店铺类型查询业务添加缓存 缓存更新策略最佳实践方案案例 - 给查询商铺的缓存添加超时剔除和主动更新 缓存穿透/雪崩/击穿缓存穿透概述项目实现 - 商铺查询缓存 缓存雪崩缓存击穿概述互斥锁逻辑…

百模大战中的AI行业:新趋势与未来发展

文章目录 每日一句正能量前言技术进步应用拓展行业变革人才竞争后记 每日一句正能量 人生最重要的价值是心灵的幸福&#xff0c;而不是任何身外之物。 前言 随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为引领技术革命的重要驱动力之一。在当前的…

物业服务投诉反馈建议建议二维码

为高效处理物业方面的投诉问题&#xff0c;进一步提升居住品质。凡尔码平台推出“二维码”便民投诉、反馈方式&#xff0c;如有群租扰民、占用堵塞消防通道或私拉乱建等问题&#xff0c;可以立即扫码或进入“凡尔码”小程序进行投诉或反馈。 如电梯出现故障物业服务企业未及时维…

助力智能车辆检测计数,基于官方YOLOv8全系列[n/s/m/l/x]开发构建道路交通场景下不同参数量级车流检测计数系统

在很多道路交通卡口都有对车流量的统计计算需要&#xff0c;有时候一些特殊时段、特殊节日等时间下对于车流的监测预警更为重要&#xff0c;恶劣特殊天气下的提早监测、预警、限流对于保证乘客、驾驶员的安全是非常重要的措施&#xff0c;本文的主要目的就是想要开发构建道路交…

最后一公里物流:发展历程与未来趋势

导言 最后一公里物流&#xff0c;作为物流体系中的关键环节&#xff0c;一直是行业关注的焦点。本文将深入研究最后一公里物流的发展历程、遇到的问题及解决过程&#xff0c;探讨未来的可用范围、在各国的应用和未来的研究趋势&#xff0c;并分析在哪些方面能取胜、在哪些方面发…

HarmonyOS引导页登陆页以及tabbar的代码说明 底部的Tabs功能3

效果 代码说明 这一功能实现起来还是麻烦&#xff0c;需要自己实现&#xff0c;在uniapp中的pages.json底部加上就能实现&#xff0c;在这里需要自己写 引入三个内容页 Home,Car,Setting &#xff0c;说明界面模块也行。引入 private tabsController: TabsController new Tab…

逆波兰计算器的完整代码

前置知识&#xff1a; 将中缀表达式转为List方法&#xff1a; //将一个中缀表达式转成中缀表达式的List//即&#xff1a;(3042)*5-6 》[(, 30, , 42, ), *, 5, -, 6]public static List<String> toIndixExpressionList(String s) {//定义一个List&#xff0c;存放中缀表达…

[Unity]接入Firebase 并且关联支付埋点

首先 在这个下一下FireBase的资源 firebase11.0.6 然后导入Analytics Auth Crashlytics 其他的看着加就行 然后直接丢到Unity里面 接下来需要去Firebase里面下载 Google json 丢到 这个下面 然后就是脚本代码了 using System.Collections; using System.Collection…

html/css实现简易圣诞贺卡

一、前言 HTML&#xff0c;全称HyperText Markup Language&#xff0c;即超文本标记语言&#xff0c;是用于创建网页的标准标记语言。HTML是一种标记语言&#xff0c;由一系列的元素标签组成&#xff0c;用于描述网页的结构和内容。 CSS&#xff0c;全称是“层叠样式表”&#…

音视频的编码格式与封装格式

音视频的编码格式与封装格式是两个不同的概念&#xff0c;视频封装格式常见的有&#xff1a;mp4&#xff0c;rmvb&#xff0c;avi&#xff0c;mkv&#xff0c;mov&#xff0c;mpg&#xff0c;vob&#xff0c;3gp&#xff0c;asf&#xff0c;rmvb&#xff0c;wmv&#xff0c;div…

中伟视界:天然气站安全隐患AI解决方案, 人工智能, 安全风险评估, 预测维护, 智能管理

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;越来越多的行业开始将人工智能应用于生产和管理中。在天然气行业&#xff0c;利用人工智能AI算法排除安全隐患已经成为一种新的趋势。那么&#xff0c;天然气站如何利用人工智能AI算法排除安全隐患呢&#xff1f;接下…

15、Qt显示图片并支持缩放、移动等操作

一、新建项目 点击“New Project”&#xff0c;选择“Application”“Qt Widget Application”&#xff0c;点击“Choose” 更改项目名称和位置 选择编译器 默认 默认 二、创建自定义类 右击项目名&#xff0c;选择“Add New” 选择“C” -> "C Class"&#xff…

数据结构和算法-二叉排序树(定义 查找 插入 删除 时间复杂度)

文章目录 二叉排序树总览二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除删除的是叶子节点删除的是只有左子树或者只有右子树的节点删除的是有左子树和右子树的节点 查找效率分析查找成功查找失败 小结 二叉排序树 总览 二叉排序树的定义 …

7-1 建立二叉搜索树并查找父结点(PTA - 数据结构)

按输入顺序建立二叉搜索树&#xff0c;并搜索某一结点&#xff0c;输出其父结点。 输入格式: 输入有三行&#xff1a; 第一行是n值&#xff0c;表示有n个结点&#xff1b; 第二行有n个整数&#xff0c;分别代表n个结点的数据值&#xff1b; 第三行是x&#xff0c;表示要搜索值…

华清远见作业第十四天

思维导图 1、顺序表按元素删除 代码&#xff1a; int delete_num_delete(sqlist *list,datatype key) {int indexseek_num(list,key);//元素查找函数if(index-1){return -1;}delete_index(list,index);return 0; } 2、顺序表按照元素修改 代码&#xff1a; //顺序表按照元…

人流量监测识别摄像机

人流量监测识别摄像机是一种基于人工智能技术的智能监控设备&#xff0c;其主要功能是通过摄像头捕捉实时画面&#xff0c;利用深度学习算法对画面中的人数进行实时识别和统计。这种摄像机可以广泛应用于各种场合&#xff0c;如商场、车站、学校、医院等公共场所&#xff0c;以…

Transformer引领AI领域:从模型到平台,全方位探索与实践

编辑推荐 在不到4 年的时间里&#xff0c;Transformer 模型以其强大的性能和创新的思想&#xff0c;迅速在NLP 社区崭露头角&#xff0c;打破了过去30 年的记录。BERT、T5 和GPT 等模型现在已成为计算机视觉、语音识别、翻译、蛋白质测序、编码等各个领域中新应用的基础构件。…

es、MySQL 深度分页问题

文章目录 es 深度分页MySQL 深度分页 es 深度分页 es 深度分页问题&#xff0c;有点忘记了&#xff0c;这里记录一下 当索引库中有10w条数据&#xff0c;比如是商品数据&#xff1b;用户就是要查在1w到后10条数据&#xff0c;怎么查询。 es查询是从各个分片中取出前1w到后10条数…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《redi…