当 A、B两个对象 A对象处理完自己任务然后传递给B进行处理任务,B处理完任务还需要A接着处理任务,这样如果只是简单的用继承的方式,在多个对象间相互调用传递,就显得混乱和力不从心了。这时候考虑用到责任链模式,就像一串念珠一样,不断的传递下去。C的代码示例如下:
1.在以前的例子中 stack中增加代码如下:
typedef struct ChainedValidator{
Validator base;
Validator * pWarpped;
Validator * pNext;
}ChainedValidator;
bool validateChain(Validator * p,int val);
#define newChainerValidator(warpped,next){ \
{{validateChain}, {warpped},{next}} \
}
bool validateChain(Validator * p,int val)
{
ChainedValidator * pThis= (ChainedValidator *)p;
p = pThis->pWarpped;
if (!p->validator(p,val))
{
return false;//1
}
p = pThis->pNext;//2
return !p||p->validator(p,val);//3、4
}
首先通过pWarpped指向的校验器进行校验,如果返回结果是false,则直接返回false(校验失败)
如果pWarpped返回的是true ,则查看pPext
如果pNext为NULL,则表示当前对象是最后一个校验器,并且之前的所有校验器都返回true,因此,直接赶回最终的校验结果true。
如果pNext不为NULL,则表示后面还有校验器,将要求pNext所指向的校验器继续进行校验处理。