簡介
責任鏈模式(Chain of Responsibility Pattern)爲請求創建了一個接收者對象的鏈。每個對象持有對下一個對象的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一對象決定處理該請求。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。
角色與職責
Handler:處理請求的接口,接口中定義一個方法,以設定和返回對下一家的引用。
ConcreteHandler:具體處理者接到請求後,可以選擇將請求處理掉,也可以將請求傳給下家。
實現
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
// 完成當前任務,需要把任務傳遞給下去
struct CarHandler {
public:
virtual void HandlerCar() = 0;
CarHandler* setNextHandler(CarHandler* handler) {
m_handler = handler;
return m_handler;
}
protected:
CarHandler* m_handler;
};
class HeadCarHandler : public CarHandler {
public:
virtual void HandlerCar() {
cout << "造車頭" << endl;
// 造完車頭以後把任務傳遞給下一個執行者。
if (m_handler != NULL) {
m_handler->HandlerCar();
}
}
};
class BodyCarHandler : public CarHandler {
public:
virtual void HandlerCar() {
cout << "造車身" << endl;
if (m_handler != NULL) {
m_handler->HandlerCar();
}
}
};
class TailCarHandler : public CarHandler {
public:
virtual void HandlerCar() {
cout << "造車尾" << endl;
if (m_handler != NULL) {
m_handler->HandlerCar();
}
}
};
int main() {
CarHandler* headHandle = new HeadCarHandler;
CarHandler* bodyHandle = new BodyCarHandler;
CarHandler* tailHandle = new TailCarHandler;
// 業務順序可以發生變化
headHandle->setNextHandler(bodyHandle);
bodyHandle->setNextHandler(tailHandle);
tailHandle->setNextHandler(NULL);
headHandle->HandlerCar();
delete headHandle;
delete bodyHandle;
delete tailHandle;
cin.get();
return 0;
}