概念
责任链模式是一种行为设置模式,它的核心思想就是将请求的发送者和接收者进行解耦,每个接收者都可以处理请求。 在责任链模式中将每个接收者连成一个链条,当有请求发送上来的时候会经过每一个接收者。直到消息被处理。
适用场景
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 处理函数处理对象