C++行为型模式-职责链模式

news2024/11/18 1:50:20

1.1 基本概念

职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这类对象链接成一条链,并沿着这条链传递请求,直到有对象处理它为止。

1.2 模式结构

 (1)Hander(抽象处理者)

定义了一个处理请求的接口;

(2)ConcreteHander(具体处理者)

处理它所负责的请求,如果可处理该请求,就处理掉这个请求;否则将该请求转发给它的下一个可以处理该请求的对象,所以它必须能访问它的下一个可以处理同样请求的对象;

(3)Client(客户类):

向处理对象提出具体的请求。

1.3 优缺点

优点:

  • 处理者对于请求者完全透明,请求者无需事先知道谁来处理;
  • 它允许多与一个的处理者对象根据自己的逻辑来决定哪一个处理者最终处理这个命令,提高系统的扩展性;
  • 扩展灵活,新增具体请求者时无需修改原有系统的代码;
  • 责任链模式减低了发出命令的对象和处理命令的对象之间的耦合;

缺点:

  • 产生许多细颗粒对象;
  • 不一定能被处理,可能到末端也没被处理或者中间写错;
  • 比较长的责任链,可能涉及多个处理对象,性能问题,还有调试不方便;
  • 建链不当,可能造成循环调用,导致系统进入死循环;

1.4 应用场景

  1. 多个对象可以处理同一请求,但具体由哪个对象处理,则需要动态决定时。
  2. 在请求者不明确的情况下需要向多个对象中的一个提交请求时。
  3. 需要动态的指定一组对象处理请求时。
  4. 系统已经有一个由处理者对象组成的链。这个链可能由复合模式给出,
  5. 当系统想发出一个请求给多个处理者对象中的某一个,但是不明显指定是哪一个处理者对象会处理此请求。
  6. 当处理一个请求的处理者对象集合需要动态地指定时

1.5 举例

请假审批系统实现。

#include<iostream>
using namespace std;
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }

//请求类 封装请求相关的信息
class HolidayRequest
{
public:
HolidayRequest(string leaveName, int leaveDays):m_leaveName(leaveName), m_leaveDays(leaveDays){};
	void setLeaveName(string leaveName) { 
		m_leaveName = leaveName;
	}
string getLeaveName(){
		return m_leaveName;
	}
	
	void setLeaveDays(int leaveDays){
		m_leaveDays = leaveDays;
	}
int  getLeaveDays(){
		return m_leaveDays;
	}
private:
	string m_leaveName;
	int m_leaveDays;
};

//抽象处理者类 The holiday request handler interface
class Manager
{
public:
	//抽象请求处理方法
	virtual bool HandleRequest(HolidayRequest *pRequest) = 0;
};

// 具体处理者 Project manager
class PM : public Manager
{
public:
	PM(Manager *handler):m_pHandler(handler){};
	bool HandleRequest(HolidayRequest *pRequest)
   {
	if (pRequest->getLeaveDays() <= 3)
{	
		cout<<"PM said:OK."<<endl;
		cout << "leave name is " << pRequest->getLeaveName() <<  " and leave days is " << pRequest->getLeaveDays();
		return true;
	}
	else{
if(m_pHandler != NULL){
			return m_pHandler->HandleRequest(pRequest);	
		}
		
    }
	return false;
   }
private:
Manager *m_pHandler;
};


// 具体处理者 Department manager
class DM : public Manager
{
public:
	DM(Manager *handler) : m_pHandler(handler){}
	bool HandleRequest(HolidayRequest *pRequest)
	{
		if (pRequest->getLeaveDays() <= 10){
			cout<<"DM said:OK."<<endl;
cout << "leave name is " << pRequest->getLeaveName() <<  " and leave days is " << pRequest->getLeaveDays();
			return true;	
		}
		else{
			if(m_pHandler != NULL){
				return m_pHandler->HandleRequest(pRequest);	
			}
		}
		return false;
	}
}
private:
	Manager *m_pHandler;
};

//具体处理者 Project supervisor
class PS : public Manager
{
public:
	PS(Manager *handler) : m_pHandler(handler){}
	bool HandleRequest(HolidayRequest *pRequest)
	{
		if (pRequest->getLeaveDays() <= 30){
cout<<"DM said:OK."<<endl;
			cout << "leave name is " << pRequest->getLeaveName() <<  " and leave days is " << pRequest->getLeaveDays()<<endl;
			return true;	
		}
		else{
			cout << "Exceed the maximum number of days off" ;
			return false;
}
		return false;
	}
private:
	Manager *m_pHandler;
};

int main()
{
	//职责链创建
	DM *pDM = new DM(NULL);
	PS *pPS = new PS(pDM);
	PM *pPM = new PM(pPS);
HolidayRequest *pHolidayRequest = new HolidayRequest("xiaoming",1);
	
	pPM->HandleRequest(pHolidayRequest);
	SAFE_DELETE(pHolidayRequest);
pHolidayRequest = new HolidayRequest("xiaogang",5);
	pPM->HandleRequest(pHolidayRequest);
	
	SAFE_DELETE(pDM);
	SAFE_DELETE(pPS);
	SAFE_DELETE(pPM);
	SAFE_DELETE(pHolidayRequest);
}

PM said:OK.
leave name is xiaoming and leave days is 1DM said:OK.
leave name is xiaogang and leave days is 5
 

参考文献:

【1】C++设计模式之职责链模式(Chain of Responsibility)(行为型) | 码农家园

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

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

相关文章

Neural Collaborative Filtering论文笔记

ABSTRACT 深度神经网络在语音识别、计算机视觉和自然语言处理等方面取得了巨大的成果&#xff0c;但是对于推荐系统尚且缺少。虽然即使有用深度学习作为推荐&#xff0c;但是都是对建模起辅助作用。当涉及到用户和项目之间的交互&#xff0c;都会选择流行的矩阵分解&#xff0…

三、react组件的生命周期

目标 灵活掌握react组件的生命周期以及组件的活动过程。 能够灵活使用react的生命周期 知识点 react的类组件的生命周期分为三个阶段 实例期存在期销毁期 实例期在组件第一次被实例化的时候触发一次&#xff0c;在这个过程中会执行的生命周期函数如下&#xff1a; construct…

2、CKA-简单搭建K8s集群

基础环境&#xff1a; 主机IP资源系统主机名192.168.100.1104核8GCentos8K8s-master192.168.100.1204核8GCentos8K8s-node1192.168.100.1304核8GCentos8K8s-node2 推荐一个小网站&#xff1a;https://labs.play-with-k8s.com/ 其他的废话不多说&#xff0c;直接部署起来先~~ 部…

[附源码]Python计算机毕业设计 校园疫情防控系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

校企合作,人才共育|湖南工程学院第二期万应低代码实训营圆满收官

2022年11月11日&#xff0c;湖南工程学院第二期万应低代码实训营圆满收官&#xff0c;来自湖南工程学院计算机与通信学院&#xff08;人工智能产业学院&#xff09;的47位同学经过为期9天、共计51课时的培训课程&#xff0c;用出色的交付成果顺利结业。湖南工程学院计算机与通信…

最简单的git图解(最基本命令)

git clone: 这个命令用于将远程代码仓库克隆到本地&#xff0c;这是对任何项目进行开发前的第一步。 比如你本地本来并没有某个项目的代码仓库&#xff0c;此时随便找一个文件目录并进入cmd命令窗口&#xff0c;执行命令git clone [remote address]&#xff0c;[remote addres…

春节静态HTML网页作业模板 传统节日文化网站设计作品 静态学生网页设计作业简单网页制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

python计算长方形面积 青少年编程电子学会python编程等级考试一级真题解析2022年6月

目录 python计算长方形面积 一、题目要求 1、编程实现 2、输入输出

TCP粘包和拆包

TCP粘包和拆包 &#xff08;1&#xff09;TCP是面向连接的&#xff0c;面向流的&#xff0c;提供可靠性服务。收发两端&#xff08;客户端和服务端&#xff09;都要有一一成对的socket&#xff0c;因此&#xff0c;发送端为了将多个发给接收端的包&#xff0c;更有效的发给对方…

【前端】Vue+Element UI案例:通用后台管理系统-代码总结

文章目录前言项目文件目录apimockServehome.jspermission.jsindex.jsmock.jsuser.jsassertcomponentsCommonAside.vueCommonHeader.vueCommonTags.vuedataechartsDataorder.jsuser.jsvideo.jsmockDatatableData.jsuserData.jsvideoData.jsCountData.jsMenuData.jsTableData.jsT…

389. 找不同(简单不一定知道)

问题描述&#xff1a; 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 &#xff1a; 示例 1&#xff1a; 输入&#xff1a;s "abcd", t …

大学生抗疫逆行者网页作业 感动人物HTML网页代码成品 最美逆行者dreamweaver网页模板 致敬疫情感动人物网页设计制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

多维时序 | MATLAB实现ELM极限学习机多维时序预测(股票价格预测)

多维时序 | MATLAB实现ELM极限学习机多维时序预测(股票价格预测) 目录 多维时序 | MATLAB实现ELM极限学习机多维时序预测(股票价格预测)效果一览基本介绍程序设计结果输出参考资料效果一览 基本介绍

MySQL-僵持锁

前言 一个僵持锁&#xff08;deadlocks&#xff09;是指锁处于僵持的状态&#xff0c;持有锁的事务既得不到期望的资源&#xff0c;也不愿意释放其他事务需要的资源&#xff0c;也就是&#xff0c;多个锁相互之间都持有其他锁所需的资源&#xff0c;所有的事务都在等待各自需要…

防止重复下单(redis+数据库唯一索引requestId实现幂等)

文章目录为什么会重复下单如何防止重复下单利用数据库实现幂等利用Redis防重为什么会重复下单 为什么会重复下单&#xff0c;对于订单服务而言&#xff0c;就是接到了多个下单的请求&#xff0c;原因可能有很多&#xff0c;最常见的是这两种&#xff1a; 用户重复提交网络原因…

使用easygui制作app

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 使用easygui制作app [太阳]选择题 对于以下python代码表述错误的一项是? import easygui easygui.msgbox("我是msgbox","msgbox标题") choices["A",…

学生网页设计作业源码(HTML+CSS)——海贼王6页代码质量好

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【Pytorch with fastai】第 13 章 :卷积神经网络

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

数据结构之线性表的顺序存储结构

配套环境 clion + g++ 顺序存储的定义 线性表的顺序存储结构,指的是用一段地址连续的存储单元一次存储线性表中的数据元素 设计思路 使用一维数组来实现顺序存储结构 存储空间:T* m_array 当前长度:int m_length 顺序存储结构的元素获取操作 判断目标位置是否合法 如…

Backblaze 2022 Q3 硬盘故障质量报告解读

在9月份&#xff0c;我们更新了Backblaze 2022上半年的中期质量报告解读&#xff08;Backblaze2022中期SSD故障质量报告解读&#xff09;&#xff0c;基于报告中的分析数据&#xff0c;Backblaze也向外界传递作证了一个信息&#xff1a;固态硬盘SSD的长期可靠性比机械硬盘HDD要…