设计模式之责任链模式(C++)

news/2024/5/19 11:49:51 标签: c++, 设计模式, 责任链模式

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、责任链模式是什么?

       责任链模式是一种行为型的软件设计模式,对象内存在对下家的引用,层层连接形成了一条责任链,请求的信息在链上传递直到某个对象决定处理该信息。

       责任链模式的优点:

  1. 请求者和接收者松耦合。请求者只需要发送请求,不关心由谁处理怎么处理;接收者只需要处理自己该处理的,剩下的交给责任链上的其他职责处理。
  2. 比较灵活。责任链上各个职责对象,可以灵活排序或组合,以应对不同场景。

       责任链模式的缺点:

  1. 性能易受影响。当责任链过长时,对请求的处理效率不够高。
  2. 不一定确保请求完整处理。每个职责只对自身部分负责,有可能请求走完整个责任链,也没有完全处理。

二、责任链模式

2.1 结构图

       客户端即Main主函数,操作者中有自己的下家,下家也是操作者。

2.2 代码示例

       场景描述:申请批假。

//Handler.h
/****************************************************/
#pragma once
#include <iostream>

using namespace std;

// 抽象操作者-职位
class Job 
{
public:
	// 批准假期
	virtual void approveLeave(int time) = 0;

	// 设置领导
	void setLeader(Job* handler) {
		m_leader = handler;
	}

protected:
	Job* m_leader = nullptr;
};

// 具体操作者-主管
class Manager : public Job 
{
public:
	// 批准假期
	virtual void approveLeave(int time) {
		if (time <= 3) {
			cout << "主管正在处理批假申请。" << endl;
		}
		else if (m_leader != nullptr) {
			m_leader->approveLeave(time);
		}
		else {
			cout << "未有合适领导批准该时长的假期申请。" << endl;
		}
	}

};

// 具体操作者-总监
class Director : public Job 
{
public:
	// 批准假期
	virtual void approveLeave(int time) {
		if (time <= 7) {
			cout << "总监正在处理批假申请。" << endl;
		}
		else if (m_leader != nullptr) {
			m_leader->approveLeave(time);
		}
		else {
			cout << "未有合适领导批准该时长的假期申请。" << endl;
		}
	}

};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Handler.h"

using namespace std;

int main() 
{
	Job* job1 = new Manager();
	Job* job2 = new Director();

	// 设置领导
	job1->setLeader(job2);

	// 收到了三份批假申请,分别3、7、10天
	job1->approveLeave(3);
	job1->approveLeave(7);
	job1->approveLeave(10);

	delete job1;
	delete job2;
	job1 = nullptr;
	job2 = nullptr;

	return 0;
}

       程序结果如下。

       job中设置的领导其实就是它的下家,当它无法对当前请求进行处理时,交给下家也就是领导来处理。3天假期主管就可以批准了,7天需要由总监批准,10天则需要更大的领导批准,因为暂时没设置能处理7天以上批假的领导,所以对该请求需要做一个未处理成功的说明。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对责任链模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解责任链模式

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!


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

相关文章

今天2023/04/17 学习的SQL语句。

今天2023/04/17 学习的SQL语句。 #第15章_存储过程与存储函数 #0.准备工作 dbtest15 USE dbtest15; CREATE TABLE employees AS SELECT * FROM atguigudb.employees; CREATE TABLE employees AS SELECT * FROM atguigudb.employees; CREATE TABLE departments AS SELECT …

JavaScript中json对象和string对象之间相互转化

JSON&#xff1a;JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;&#xff0c;其实JSON就是一个JavaScript的对象(Object)而已。 json对象 代码如下: var json {aa:true,bb:true}; var json1 {aa:b,bb:{cc:true,dd:true}}; 1&#xff1a;js…

防止机械/移动硬盘休眠 - NoSleepHD

防止机械/移动硬盘休眠 - NoSleepHD 前言解决方案计算机硬盘移动硬盘 前言 机械硬盘休眠后唤醒需要一定时间&#xff0c;且频繁的启动和停止并不有利于硬盘的寿命&#xff0c;因此可根据自身需求防止机械硬盘休眠&#xff0c;下文以Win10系统为例介绍解决方案。 值得一提的是…

FPGA基于XDMA实现PCIE X8的HDMI视频采集 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证9、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xff0c;比起 PC…

一键汇总——高效电脑检索方案

文件检索和分类对于电脑内部的文件检索非常重要&#xff0c;因为它们可以帮助用户快速找到需要的文件。在电脑内部&#xff0c;文件通常被分类存储在不同的分区中&#xff0c;这有助于管理员更好地组织和查找文件。对于分区资源整合&#xff0c;以下是一些建议&#xff1a; 了…

《使用循环做一些练习》---C语言

目录 前言&#xff1a; 1.练习专题 1.1打印1-100之间的奇数 1.2计算n的阶乘 1.3计算到达n阶乘的前m个阶乘相加 1.4演示字符串动态变化的效果 2.goto语句 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础…

uni——页面栈,刷新上个页面的列表

案例说明 一般新增后或者编辑后&#xff0c;刷新上个页面数据 setTimeout(() > {this.$common.prePage().list []this.$common.prePage().getList()this.$common.back(1) }, 1200);prePage()方法封装&#xff1a; const prePage () > {let pages getCurrentPages()…

<<c和指针>>温故及问题研讨(第三章)

第三章-数据 1. 前言2. 基本数据类型2.1 整型家族2.2 字面值常量 3. 基本声明3.1 数组的声明以及引用3.2 指针的声明注意事项3.3 隐式声明 4. 常量5. 作用域5.1 代码块作用域5.2 文件作用域5.3 原型作用域 6. 链接属性6.1 链接属性分类以及作用范围6.2 关键字:extern和static6.…