您的位置:首页 > 其它

C 责任链模式

2018-02-13 23:40 225 查看
当 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所指向的校验器继续进行校验处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C