使多個物件都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。

HandleRequest() 並持有 m_pSuccessor 指向下一處理者。m_pSuccessor->HandleRequest()。鏈尾若無人處理則請求落空。#ifndef CHAINOFRESPONSIBILITY_H
#define CHAINOFRESPONSIBILITY_H
#include <cstdio>
class Handler {
public:
Handler(Handler* pSuccessor = nullptr);
virtual ~Handler();
virtual void HandleRequest() = 0;
protected:
Handler* m_pSuccessor;
};
class ConcreteHandler1 : public Handler {
public:
ConcreteHandler1(Handler* pSuccessor = nullptr) : Handler(pSuccessor) {}
virtual ~ConcreteHandler1() {}
virtual void HandleRequest();
};
class ConcreteHandler2 : public Handler {
public:
ConcreteHandler2(Handler* pSuccessor = nullptr) : Handler(pSuccessor) {}
virtual ~ConcreteHandler2() {}
virtual void HandleRequest();
};
#endif
#include "ChainOfResponsibility.h"
#include <iostream>
Handler::Handler(Handler* pSuccessor) : m_pSuccessor(pSuccessor) {}
Handler::~Handler() { delete m_pSuccessor; m_pSuccessor = nullptr; }
void ConcreteHandler1::HandleRequest() {
if (m_pSuccessor) m_pSuccessor->HandleRequest();
else std::cout << "HandleRequest by ConcreteHandler1\n";
}
void ConcreteHandler2::HandleRequest() {
if (m_pSuccessor) m_pSuccessor->HandleRequest();
else std::cout << "HandleRequest by ConcreteHandler2\n";
}
#include "ChainOfResponsibility.h"
#include <cstdlib>
int main() {
Handler* p1 = new ConcreteHandler1();
Handler* p2 = new ConcreteHandler2(p1); // p2 -> p1
p2->HandleRequest(); // p2 無法處理 -> 傳給 p1 -> p1 處理
delete p2;
return 0;
}
Request 類別(含型別、資料、優先級),處理者根據請求內容決定是否處理。std::function + std::vector 組裝管線,或採用中介軟體模式。