现有多个处理者。这些处理者可以处理不同的请求。这些处理者有等级关系,每个处理者都有更上级的处理者。对于最上级的处理者,可以没有上级。对于一个上级处理者,可以有多个下级处理者。
客户端发出了一个请求,请求被传递给一个最下级处理者。而该处理者无法处理该请求,于是将该请求发送给自己的上级。上级的处理者无法处理该请求,于是将该请求再度发往自己的上级……直到有某个处理者可以处理该请求。如果请求发送给最上级依然无法被处理,那么该请求就需要被抛出异常,或者有其他处理方式。
这一级一级的关系就像链条,故称之为责任链模式。
1. 定义请求
请求的定义是公开的,即必须为所有人可见,无论是客户还是处理者。
enum eRequest
{
requestLevelA,
requestLevelB,
requestLevelC,
};
// 请求
class Request
{
public:
eRequest _request;
};
2. 定义处理者基类
处理者基类规定了处理者的接口。
同时每个处理者存有上级的指针,当自身无法处理某个请求时,将该请求提交给自己的上级。
// 处理者
class Manager
{
public:
//设置直接上级
void setSuperior(Manager* superior) { _superior = superior; }
//要求处理请求
virtual void askForRequest(Request* request) = 0;
protected:
Manager* _superior;
};
3. 定义处理者派生类
处理者派生类在请求处理函数中会对请求进行分析。若请求自身可以进行处理,那么处理;否则提交给自己的上级。
// 团队队长
class TeamLeader : public Manager
{
public:
virtual void askForRequest(Request* request)
{
if (request->_request == requestLevelA)
{
处理请求
}
else
{
_superior->askForRequest(request);
}
};
};
// 总监
class Majordomo : public Manager
{
public:
virtual void askForRequest(Request* request)
{
if (request->_request == requestLevelB)
{
处理请求
}
else
{
_superior->askForRequest(request);
}
};
};
// 老板
class Boss : public Manager
{
public:
// 老板可以处理所有请求
virtual void askForRequest(Request* request)
{
处理请求
}
};
4. 用户使用
用户产生一个请求,然后将该请求提交给最低级的处理者即可。无论用户产生什么样的请求,都是如此。
void main()
{
Manager* leader = new TeamLeader();
Manager* major = new Majordomo();
Boss* boss = new Boss();
leader->setSuperior(major);
major->setSuperior(boss);
Request* rq = new Request();
rq->_request = requestLevelA;
leader->askForRequest(rq);
rq->_request = requestLevelB;
leader->askForRequest(rq);
rq->_request = requestLevelC;
leader->askForRequest(rq);
}
责任链模式,一定要注意请求的配置,务必确保每一个请求都有某个级别的处理者可以进行处理。否则,当责任链走完,很可能请求没有被处理,那么就只能抛出异常,或使用通用的请求处理。
一个责任链,可以是一条线,一棵树,或者一个环。对于环形的责任链,不存在最上级。这种情况下,请求必须可以被某个处理者处理,否则会死循环。
下图是一个树形的责任链: