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

news/2024/5/19 12:28:35 标签: 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/5089505.html

相关文章

值得拥有的 12 大最佳照片恢复软件 [持续更新]

由于误删、损坏、病毒攻击等原因&#xff0c;您可能会丢失珍贵的照片。幸运的是&#xff0c;市场上有专业的照片恢复工具。但是&#xff0c;根据您的需要找到合适的照片恢复软件的任务可能压力很大。为了帮助您做出正确的决定&#xff0c;我们精心挑选了您可以信赖的收费最高的…

thymeleaf,bootstrap-fileinput 多文件上传

组件遍历上传 一、前端 <!DOCTYPE html> <html lang"zh" xmlns:th"http://www.thymeleaf.org" > <head><th:block th:include"include :: header(修改固定资产信息)" /><th:block th:include"include :: date…

【数据库系统概论】第四章数据库安全性

数据库的安全性&#xff1a;保护数据库以防止不合法使用所造成的数据泄露、更改或破坏 grant和revoke语法

无法启动此程序,因为计算机中丢失MSVCR71.dll的详细解决修复方法

大家好&#xff01;今天我来给大家分享一下msvcp71.dll丢失的修复方法。 首先&#xff0c;让我们来了解一下msvcp71.dll文件。msvcp71.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package所包含的一个文件。这个文件被许多软件和游戏需…

项目管理之六大目标及成功方程式

项目管理的六大目标分别是范围、质量、时间、成本、收益和风险。在项目开始之前&#xff0c;需要明确了解项目的范围&#xff0c;并在项目执行过程中对范围进行严格控制&#xff0c;确保项目不偏离既定的范围。同时&#xff0c;需要明确项目的质量标准和预期成果&#xff0c;然…

【Java】Math 类

java.lang.Math&#xff08;类&#xff09;&#xff1a;Math包含执行基本数字运算的方法。它不能创建对象&#xff0c;它的构造方法被"私有"了。因为它内部都是“静态方法”&#xff0c;通过“类名”直接调用即可。 方法名称说明public static int abs(E e)返回绝对值…

C++指针解读(3)-- 指针变量作为函数参数

函数执行是通过系统栈来实现的&#xff0c;系统栈分为若干个栈帧。栈帧就是函数运行的环境&#xff0c;每个函数在被调用时都会在系统栈区形成一个叫栈帧的结构。一次函数调用相关的数据保存在栈帧中&#xff0c;比如函数参数、函数的局部变量、函数执行完后的返回地址等数据。…

普冉PY32系列(八) GPIO模拟和硬件SPI方式驱动无线收发芯片XN297LBW

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…