概念
責任鏈模式是一種行為設置模式,它的核心思想就是將請求的發送者和接收者進行解耦,每個接收者都可以處理請求。 在責任鏈模式中將每個接收者連成一個鏈條,當有請求發送上來的時候會經過每一個接收者。直到消息被處理。
適用場景
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 處理函數處理對象