当前位置: 首页 > news >正文

行为模式---责任链模式

概念

责任链模式是一种行为设置模式,它的核心思想就是将请求的发送者和接收者进行解耦,每个接收者都可以处理请求。 在责任链模式中将每个接收者连成一个链条,当有请求发送上来的时候会经过每一个接收者。直到消息被处理。

适用场景

1、当程序中使用不同的方式处理各种不同的请求的时候,而请求的顺序是未知的,这个时候就可以使用责任链模式。

2、当请求必须按照一定的顺序进行处理的时候,就可以使用责任链模式。

3、如果所需要接收者及其顺序在运行时需要改变的时候,就需要使用到责任链模式。

创建方式

1、创建接收者接口,在接口中声明处理函数、一个自己对象的引用、一个设置下一个接收者的函数。

2、创建实际的接收者,实现继承接收者接口,在实际的处理函数中判断当前请求能否处理,如果如果无法处理,就想请求传递给下一个处理者。

3、在客户端使用的时候首先需要创建所有的实际处理者对象,并将所有的处理者对象通过设置的方式将其全部连接起来。传入需要处理的请求。

类关系图

在这里插入图片描述

示例代码

#include "ZeRenLianMoShi.h"

int main()
{
    std::cout << "欢迎东哥来到设计模式的世界!\n";
    RecipientBase* recipient = new CompentRecipient("处理1");
    RecipientBase* recipient1 = new CompentRecipient1("处理2");
    recipient1->setNextRecipient(recipient);
    RecipientBase* recipient2 = new CompentRecipient2("处理3");
    recipient2->setNextRecipient(recipient1);
    recipient2->handle("处理1");
    recipient2->handle("处理2");
    recipient2->handle("处理3");
}
#pragma once
#include <iostream>
#include <string>

using namespace std;

//接收者接口
class RecipientBase
{
public:
	RecipientBase() {}
	~RecipientBase() {}
	virtual void setNextRecipient(RecipientBase* rec) {}
	virtual void handle(string cmd) {}
	RecipientBase* m_rec = nullptr;
};

//具体接收者 CompentRecipient
class CompentRecipient : public RecipientBase {
public:
	CompentRecipient(string cmd) {
		m_cmd = cmd;
	};
	~CompentRecipient() {}
	void setNextRecipient(RecipientBase* rec) {
		m_rec = rec;
	}
	void handle(string cmd) {
		if (cmd == m_cmd) {
			cout << "CompentRecipient 处理函数处理对象" << endl;
		}
		else {
			if (m_rec) {
				m_rec->handle(cmd);
			}
		}
	}
private:
	string m_cmd;
};

//具体接收者 CompentRecipient1
class CompentRecipient1 : public RecipientBase {
public:
	CompentRecipient1(string cmd) {
		m_cmd = cmd;
	};
	~CompentRecipient1() {}
	void setNextRecipient(RecipientBase* rec) {
		m_rec = rec;
	}
	void handle(string cmd) {
		if (cmd == m_cmd) {
			cout << "CompentRecipient1 处理函数处理对象" << endl;
		}
		else {
			if (m_rec) {
				m_rec->handle(cmd);
			}
		}
	}
private:
	string m_cmd;
};

//具体接收者 CompentRecipient2
class CompentRecipient2 : public RecipientBase {
public:
	CompentRecipient2(string cmd) {
		m_cmd = cmd;
	};
	~CompentRecipient2() {}
	void setNextRecipient(RecipientBase* rec) {
		m_rec = rec;
	}
	void handle(string cmd) {
		if (cmd == m_cmd) {
			cout << "CompentRecipient2 处理函数处理对象" << endl;
		}
		else {
			m_rec->handle(cmd);
		}
	}
private:
	string m_cmd;
};

欢迎东哥来到设计模式的世界!
CompentRecipient 处理函数处理对象
CompentRecipient1 处理函数处理对象
CompentRecipient2 处理函数处理对象
http://www.dtcms.com/a/56994.html

相关文章:

  • window 11亲测NodeMCU-8266 开发板+Micropython点灯实验
  • Feign 核心规则与最佳实践:避免入坑指南
  • 正向代理与反向代理
  • Redis- 哨兵
  • Restful 接口设计规范
  • springcloud sentinel教程
  • Amazon Trust Services证书体系解析与应用实战指南
  • 【统计至简】【入门测试4】协方差矩阵的特征值分解
  • C++将 nums 向量的内容替换为 newArr 容器中的元素
  • 傅里叶变换:跨越时空的数学魔法
  • Spring-事务
  • mmseg
  • 【算法 C/C++】二维差分
  • 使用MPU6050产生中断,唤醒休眠中的STM32
  • 蓝破云可以实现500M以下文件的百度云到阿里云的转存的云计算服务平台(大约每天50个的限制)
  • 元组(Tuple)详解——c#
  • JVM常用概念之移动GC和局部性
  • hadoop集群环境配置
  • JavaWeb学习——过滤器和监听器
  • 北京大学第五弹:《DeepSeek私有化部署和一体机》
  • Ubuntu-docker安装mysql
  • yoloV5训练visDrone2019-Det无人机视觉下目标检测
  • 开启焊接设备安全管控新纪元
  • 安装完flash-attn,使用时报错undefined symbol
  • Android View设置圆角方式大全
  • Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)
  • 【Linux】外接硬盘管理
  • Selenium库打开指定端口(9222、9333等)浏览器【已解决!!!】
  • 【JAVA架构师成长之路】【电商系统实战】第9集:订单超时关闭实战(Kafka延时队列 + 定时任务补偿)
  • 计算机视觉|MAE 的项目实战:从图像重建到目标检测