【25】c++设计模式——>责任链模式

news/2024/5/19 13:45:03 标签: c++, 设计模式, 责任链模式

责任链模式定义

C++中的责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求沿着处理对象的链传递来避免把请求发送者与接收者耦合在一起。
责任链模式的主要思想是,通过将多个处理对象组成一条链,每个处理对象都有机会处理请求。如果某个对象不能处理请求,则将请求传递给下一个对象依次处理,直到请求被处理为止。
责任链模式通常涉及以下几个角色:
1.请求(request):封装了需要进行处理的信息,以便于在责任链上传递。
2.抽象处理者(Handler):定义了处理请求的接口,并维护一个指向下一个处理者的引用,以便于在责任链中传递请求。
3.具体处理者(Concrete Handler):实现了处理请求的方法,并检查是否有足够的权限或能力来处理请求。如果可以处理请求,则进行处理并返回结果;否则将请求传递给下一个处理者。
使用责任链模式的主要目的是让不同的处理对象负责不同的处理逻辑,并将这些对象串成一条链。这样一来,我们可以动态地改变请求的处理顺序或重新配置责任链,而不影响客户端代码。

实例代码

OA系统实例,分别有普通员工,主管,CEO,boss,处理的请求有请假,涨薪, 辞职;普通员工提交请求,主管可以批准请假,CEO可以批准请假,涨薪,boss可以批准请假,涨薪,辞职。
主管处理不了的递交给CEO,CEO处理不了的递交给boss。

#include <iostream>
using namespace std;


enum class RequestType :char {qingjia,zhangxin,cizhi};
//抽象管理者类,manager,ceo,boss都继承这个类
class AbstractManager
{
public:
	void setNext(AbstractManager* next) //指向下一个管理者
	{
		m_next = next;
	}
	virtual void  handleRequest(RequestType type) = 0; //每个管理者都要重写这个处理请求的函数
	virtual ~AbstractManager() {}
protected:
	AbstractManager* m_next = nullptr; //子类可以继承
};

//manager主管
class Manager : public AbstractManager
{
public:
	void  handleRequest(RequestType type)  //每个管理者都要重写这个处理请求的函数
	{
		switch (type)
		{
		case RequestType::qingjia:
			cout << "请假:同意" << endl;
			break;
		case RequestType::zhangxin:
			cout << "涨薪:我要请示CEO" << endl;
			m_next->handleRequest(type); //m_next是下个界别的对象指针
			break;
		case RequestType::cizhi:
			cout << "辞职:我要请示上级" << endl;
			m_next->handleRequest(type); //m_next是下个界别的对象指针
			break;
		default:
			break;
		}
	}
};

//CEO
class CEO : public AbstractManager
{
public:
	void  handleRequest(RequestType type)  //每个管理者都要重写这个处理请求的函数
	{
		switch (type)
		{
		case RequestType::qingjia:
			cout << "请假:同意" << endl;
			break;
		case RequestType::zhangxin:
			cout << "再等等吧" << endl;
			break;
		case RequestType::cizhi:
			cout << "辞职:我要请示上级" << endl;
			m_next->handleRequest(type); //m_next是下个界别的对象指针
			break;
		default:
			break;
		}
	}
};

//boss
class BOSS : public AbstractManager
{
public:
	void  handleRequest(RequestType type)  //每个管理者都要重写这个处理请求的函数
	{
		switch (type)
		{
		case RequestType::qingjia:
			cout << "请假:再忍忍吧" << endl;
			break;
		case RequestType::zhangxin:
			cout << "再等等吧" << endl;
			break;
		case RequestType::cizhi:
			cout << "辞职:再缓一缓吧" << endl;
			break;
		default:
			break;
		}
	}
};

//请假人的类
class YG
{
public:
	void request(RequestType type, AbstractManager* manager)
	{
		manager->handleRequest(type);
	}
};

int main()
{
	Manager* manager = new Manager;
	CEO* ceo = new CEO;
	BOSS* boss = new BOSS;

	manager->setNext(ceo);
	ceo->setNext(boss);

	YG* yg = new YG;
	yg->request(RequestType::qingjia, manager);
	yg->request(RequestType::zhangxin, manager);
	yg->request(RequestType::cizhi, manager);

	yg->request(RequestType::qingjia, ceo);
	yg->request(RequestType::zhangxin, ceo);
	yg->request(RequestType::cizhi, ceo);

	yg->request(RequestType::qingjia, boss);
	yg->request(RequestType::zhangxin, boss);
	yg->request(RequestType::cizhi, boss);

	return 0;

}

http://www.niftyadmin.cn/n/5092233.html

相关文章

飞花令游戏(Python)

飞花令是古时候人们经常玩一种“行酒令”的游戏&#xff0c;是中国古代酒令之一&#xff0c;属雅令。“飞花”一词则出自唐代诗人韩翃《寒食》中 春城无处不飞花 一句。行飞花令时选用诗和词&#xff0c;也可用曲&#xff0c;但选择的句子一般不超过7个字。 在《中国诗词大会》…

十五届蓝桥杯软件和信息技术大赛

目录 &#x1f388;大赛奖项 &#xff08;一&#xff09;高校类 1. 软件赛 2. 电子赛 3. 视觉艺术设计赛 4. 数字科技创新赛 &#x1f388;奖项设置 &#x1f388;时间安排&#xff08;预计&#xff09; &#x1f388;规则简介 &#x1f388;如何准备&#xff1f; &a…

Python进阶之迭代器

文章目录 前言一、迭代器介绍及作用1.可迭代对象2. 迭代器 二、常用函数和迭代器1.常用函数2.迭代器 三、总结结束语 &#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注…

KMP 算法 + 详细笔记

给两个字符串&#xff0c;T"AAAAAAAAB"&#xff0c;P"AAAAB"; 可以暴力匹配&#xff0c;但是太费时和效率不太好。于是KMP问世&#xff0c;我们一起来探究一下吧&#xff01;&#xff01;&#xff01; &#xff08;一&#xff09;最长公共前后缀 D[i] p[…

设置Json序列化时字段的顺序

1. 背景 在部分使用场景&#xff08;如元数据驱动&#xff0c;后台接口仅返回序列化后的json字符串&#xff0c;前端需要根据每个字段在前端呈现&#xff09;&#xff0c;需要手动设置字段的长度。通常情况下&#xff0c;框架是有默认的顺序&#xff0c;如 jackson 默认使用字…

Python学习-----Day06

冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列…

盒子(Box, ACM/ICPC NEERC 2004, UVa1587)rust解法

给定6个矩形的长和宽wi和hi&#xff08;1≤wi&#xff0c;hi≤1000&#xff09;&#xff0c;判断它们能否构成长方体的6个面。 样例 1345 2584 2584 683 2584 1345 683 1345 683 1345 2584 683 xing1234 4567 1234 4567 4567 4321 4322 4567 4321 1234 4321 1234 buxing解法 …

通过HTTP发送大量数据的三种方法

在网络的早期时期&#xff0c;人们发送的文件大小仅为几KB。到了2023年&#xff0c;我们享受着高分辨率的MB级别图像&#xff0c;并在几GB的4K&#xff08;即将是8K&#xff09;视频中观看。 即使有良好的互联网连接&#xff0c;下载一个5GB的文件仍然需要一些时间。如果你拥有…