职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿这条链传递该请求,直到有一个对象处理它为止。
这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。
职责链模式结构图:
Handler类,定义一个处理请求的接口
class Handler
{
protected:
Handler *successor;
public:
void SetSuccessor(Handler *successor) //设置继任者
{
this->successor = successor;
}
void HandleRequest(int request)=0; //处理请求的抽象方法
};
ConcreteHandler类,具体处理者类,处理它所负者的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。
ConcreteHandler1,当请求数在0到10之间则有权处理,否则转到下一位
class ConcreteHandler1 : Handler
{
public:
void HandleRequest(int request)
{
if(request >= 0 && request<10)
{
cout<< “ConcreteHandler1”<<“处理请求:”<<request<<endl;
}
else if(successor != NULL)
{
successor->handleRequest(request);
}
}
};
ConcreteHandler2,当请求数在10到20之间则有权处理,否则转到下一位。
class ConcreteHandler2 : Handler
{
public:
void HandleRequest(int request)
{
if(request >= 10 && request<20)
{
cout<< “ConcreteHandler2”<<“处理请求:”<<request<<endl;
}
else if(successor != NULL)
{
successor->handleRequest(request);
}
}
};
ConcreteHandler3,当请求数在20到30之间则有权处理,否则转到下一位。
class ConcreteHandler3 : Handler
{
public:
void HandleRequest(int request)
{
if(request >= 20 && request<30)
{
cout<< “ConcreteHandler3”<<“处理请求:”<<request<<endl;
}
else if(successor != NULL)
{
successor->handleRequest(request);
}
}
};
客户端代码,向链上的具体处理者对象提交请求。
void main()
{
Handler *h1 = newConcreteHandler1();
Handler *h2 = newConcreteHandler2();
Handler *h3 = newConcreteHandler3();
h1->SetSuccessor(h2);
h2->SetSuccessor(h3);
int request[]={2,5,14,22,18,3,27,20};
for(int i=0;i<8;i++)
{
h1->HandleRequest(request[i]);
}
}
职责链的好处:
1. 当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
2. 可以随时地增加或修改处理的请求的结构,增强了对象指派职责的灵活性