Chain of Responsibility 模式也叫责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来完成同一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。
结构图
具体应用
软件窗口的消息传递。
servlet容器的过滤器(Fliter)框架实现
eg:
现需要造车,造车分为三部分:早车头,造车身,造车尾。利用职责连实现。
算法实现:
基类:
class Handle{
private:
Handle *next;
public :
Handle(Handle *next){
this->next = next;
}
virtual void HandleRequest(){
if (next){
next->HandleRequest();
}
}
virtual ~Handle(){
cout << "基类析构函数" << endl;
if (next){
next->~Handle();
}
}
};
造车头类:
class ConcreteHandleHead :public Handle{
public :
ConcreteHandleHead(Handle *next) :Handle(next){};
void HandleRequest(){
cout << "造车头" << endl;
Handle::HandleRequest();
}
~ConcreteHandleHead(){
cout << "造车头析构函数执行" << endl;
}
};
造车身类:
class ConcreteHandleBody :public Handle{
public:
ConcreteHandleBody(Handle *next) :Handle(next){};
void HandleRequest(){
cout << "造车身" << endl;
Handle::HandleRequest();
}
~ConcreteHandleBody(){
cout << "造车身析构函数执行" << endl;
}
};
造车尾类:
class ConcreteHandleTail :public Handle{
public:
ConcreteHandleTail(Handle *next) :Handle(next){};
void HandleRequest(){
cout << "造车尾" << endl;
Handle::HandleRequest();
}
~ConcreteHandleTail(){
cout << "造车尾析构函数执行" << endl;
}
};
客户端:
int main(void){
ConcreteHandleTail *pt = new ConcreteHandleTail(NULL);
ConcreteHandleBody *pb = new ConcreteHandleBody(pt);
ConcreteHandleHead *ph = new ConcreteHandleHead(pb);
ph->HandleRequest();
delete ph;
return 0;
}
调试结果: