1 什么是责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,用于建立一个对象链,每个对象都有机会处理请求。请求沿着对象链传递,直到有一个对象能够处理它为止。这样,责任链模式将请求的发送者和接收者解耦,动态确定处理请求的对象。
在责任链模式中,通常有两种角色:抽象处理者(Handler)和具体处理者(Concrete Handler)。抽象处理者定义了处理请求的接口,并实现了一个指向下一个处理者的引用。具体处理者继承自抽象处理者,负责实际的处理请求逻辑,并根据需要决定是否将请求传递给下一个处理者。
2 举个例子
下面以一个审批流程为例来说明责任链模式。假设有一个请假申请的处理流程,包括三个级别的审批者:组长、经理和总经理。每个审批者可以决定是否批准申请,并将申请传递给下一个级别的审批者,直到达到最终的处理者。
首先,我们定义一个抽象处理者接口Handler,其中包含两个方法:处理请求的HandleRequest和设置下一个处理者的SetNext。
class Handler
{
public:
virtual void HandleRequest(const Request& request) = 0;
virtual void SetNext(Handler* next) = 0;
};
然后,我们创建具体处理者类GroupLeader、Manager和GeneralManager,分别代表组长、经理和总经理。
class GroupLeader : public Handler
{
public:
void HandleRequest(const Request& request)
{
if (request.level <= 1)
{
std::cout << "GroupLeader handle the request." << std::endl;
}
else if (next_ != nullptr)
{
next_->HandleRequest(request);
}
}
void SetNext(Handler* next)
{
next_ = next;
}
private:
Handler* next_;
};
class Manager : public Handler
{
public:
void HandleRequest(const Request& request)
{
if (request.level <= 2)
{
std::cout << "Manager handle the request." << std::endl;
}
else if (next_ != nullptr)
{
next_->HandleRequest(request);
}
}
void SetNext(Handler* next)
{
next_ = next;
}
private:
Handler* next_;
};
class GeneralManager : public Handler
{
public:
void HandleRequest(const Request& request)
{
if (request.level <= 3)
{
std::cout << "GeneralManager handle the request." << std::endl;
}
else
{
std::cout << "No one can handle the request." << std::endl;
}
}
void SetNext(Handler* next)
{
next_ = next;
}
private:
Handler* next_;
};
最后,我们可以创建一个处理者链,并将请求从第一个处理者传递到链上的每个处理者,直到找到一个能够处理请求的处理者。
int main()
{
Handler* groupLeader = new GroupLeader();
Handler* manager = new Manager();
Handler* generalManager = new GeneralManager();
groupLeader->SetNext(manager);
manager->SetNext(generalManager);
Request request;
request.level = 2;
groupLeader->HandleRequest(request);
delete groupLeader;
delete manager;
delete generalManager;
return 0;
}
在上述例子中,当传入的请求级别为2时,组长(GroupLeader)对象将能够处理请求,并输出相应的处理消息。如果请求级别为3,则会继续将请求传递给下一个处理者,经理(Manager)对象进行处理。如果请求级别为4,则总经理(GeneralManager)对象将会处理请求。
3 总结
通过使用责任链模式,我们实现了一个动态的请求处理流程,可以简单地添加或移除处理者,而不需要修改客户端代码。这样,可以更灵活地管理和处理请求,并提高系统的可扩展性。
标签:请求,处理,request,模式,next,责任,Handler,HandleRequest,行为 From: https://www.cnblogs.com/luoxiang/p/17823523.html