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

概念

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

适用场景

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

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

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

创建方式

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

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

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

类关系图

示例代码

cpp 复制代码
#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");
}
cpp 复制代码
#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;
};
cpp 复制代码
欢迎东哥来到设计模式的世界!
CompentRecipient 处理函数处理对象
CompentRecipient1 处理函数处理对象
CompentRecipient2 处理函数处理对象
相关推荐
sg_knight7 小时前
设计模式实战:责任链模式(Chain of Responsibility)
python·设计模式·责任链模式
Rsun045515 天前
17、Java 责任链模式从入门到实战
java·python·责任链模式
yaaakaaang7 天前
十三、责任链模式
java·责任链模式
恼书:-(空寄9 天前
责任链模式实现流程动态编排
java·责任链模式
狂奔蜗牛(bradley)10 天前
嵌入式软件中如何用责任链模式重构串口协议栈
网络·单片机·mcu·重构·责任链模式
Yupureki20 天前
《Linux系统编程》20.常见程序设计模式
linux·服务器·c语言·c++·单例模式·建造者模式·责任链模式
砍光二叉树21 天前
【设计模式】行为型-责任链模式
java·设计模式·责任链模式
大数据新鸟21 天前
设计模式详解——责任链模式
责任链模式
Yu_Lijing1 个月前
基于C++的《Head First设计模式》笔记——责任链模式
c++·笔记·设计模式·责任链模式
逆境不可逃1 个月前
【从零入门23种设计模式13】行为型之责任链模式
算法·leetcode·游戏·设计模式·责任链模式