责任链模式的含义
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
核心思想及解释
责任链模式的核心思想是解耦请求的发送者和接收者,并给多个对象处理请求的机会。通过建立一条链来组织接收者,请求沿链传递,直到被处理。这样做的好处是可以动态地添加或者重新排列处理请求的责任。每个处理者只关心自己负责的工作,不需要知道链的结构,从而实现了请求发送者和接收者之间的松耦合。
为什么要使用责任链模式
- 减少请求的发送者和接收者之间的耦合:请求的发送者不需要知道是哪一个接收者处理了请求,链的结构自由灵活,易于扩展。
- 增加新的请求处理类方便:增加新的处理类很方便,并不需要修改现有的代码,只需修改配置或者在运行时动态地添加即可。
- 可动态组织和分配责任:可以根据需要在运行时改变链中的成员或调整它们的顺序。
使用责任链模式需要注意的点
- 保证请求一定被处理:可能存在请求没被任何对象处理的情况,应该有一些机制保证请求至少得到基本处理。
- 性能问题:在某些情况下,由于请求可能在链上进行多次传递,可能会影响性能。
- 调试困难:由于处理过程分布在链的多个对象中,调试可能会比较困难。
工程的应用场景
- 多级审批流程:例如,采购审批、报销流程等,每个审批级别可以作为链上的一个节点。
- 事件处理系统:如 GUI 中的事件传递,事件可以由一个组件到另一个组件传递。
- 拦截过滤器:如 Web 开发中的请求预处理、日志记录、权限检查等。
示例代码及解释
假设我们正在实现一个文档审批流程,文档需要经过多个部门的审批。
首先定义处理器的基类:
#include <iostream>
#include <memory>
class Handler {
protected:
std::shared_ptr<Handler> next;
public:
virtual ~Handler() {}
void setNext(std::shared_ptr<Handler> handler)
{
next = handler;
}
virtual void handleRequest(int approvalLevel)
{
if (next != nullptr)
{
next->handleRequest(approvalLevel);
} else
{
std::cout << "End of chain, no handler for the request." << std::endl;
}
}
};
定义具体的处理类:
class Manager : public Handler
{
public:
void handleRequest(int approvalLevel) override
{
if (approvalLevel < 10)
{
std::cout << "Manager approved request level " << approvalLevel << std::endl;
}
else if (next != nullptr)
{
next->handleRequest(approvalLevel);
}
}
};
class Director : public Handler
{
public:
void handleRequest(int approvalLevel) override
{
if (approvalLevel < 20)
{
std::cout << "Director approved request level " << approvalLevel << std::endl;
}
else if (next != nullptr)
{
next->handleRequest(approvalLevel);
}
}
};
class VicePresident : public Handler
{
public:
void handleRequest(int approvalLevel) override
{
if (approvalLevel < 50)
{
std::cout << "Vice President approved request level " << approvalLevel << std::endl;
}
else
{
// 如果没有下一个处理者,说明到达链的末端
std::cout << "End of chain, no handler for the request." << std::endl;
}
}
};
客户端代码:
int main() {
std::shared_ptr<Handler> manager = std::make_shared<Manager>();
std::shared_ptr<Handler> director = std::make_shared<Director>();
std::shared_ptr<Handler> vp = std::make_shared<VicePresident>();
manager->setNext(director);
director->setNext(vp);
manager->handleRequest(5);
manager->handleRequest(15);
manager->handleRequest(25);
manager->handleRequest(55); // This will not be handled by anyone
return 0;
}
输出代码运行结果
Manager approved request level 5
Director approved request level 15
Vice President approved request level 25
End of chain, no handler for the request.
这个示例演示了责任链模式在处理具有多级审批需求的场景中的应用。各级审批者(经理、主管、副总裁)作为链中的节点,根据审批等级决定是否处理请求或将请求传递给链中的下一个对象。