简介
责任链模式(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;
}