初看到责任链模式,想到原来用MFC写程序响应函数可以在VIEW类中添加也可以在FRAME类中添加也可以在DOC类中添加。如果同时有添加,只优先响应其中一个。责任链的意图也就是使多个对象都由机会处理请求,从而避免请求的发送至和接受者之间耦合,是接受者形成一条责任链,要么自己处理要么交给后继者。又好像单位采购,部门可以审批一定数额的采购,总经理可以审批更多数额的采购。
责任链适用的场景是当多个对象可以处理一个请求而不能预先确定,但也有可能一个请求没有被任何一个接受者处理。而在实现上并不复杂,接受者维护一个指向后继指针,同时确定自己的职责,即可以处理的请求。
代码示例:
class handler {
public:
handler(bool isOk,handler* successor=NULL ){ _ok=isOk; _successor=successor; };
virtual void handle()=0;
protected:
handler* _successor; //后继者对象指针
bool _ok; //是否自己处理请求
};
class basicHandler : public handler {
public:
basicHandler(bool isOk, handler* succerros=NULL):handler(isOk,succerros){};
virtual void handle()
{
if(this->_ok){
printf("handled by basicHandler\n");
return ;
}
else if(_successor){
printf("leave it to others to handle\n");
_successor->handle();
return ;
}
};
};
int _tmain(int argc, _TCHAR* argv[])
{
basicHandler a(true);
basicHandler b(false,&a);
b.handle();
getchar();
return 0;
}