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