责任链模式(Chain of Responsibility Pattern)
发布时间
阅读量:
阅读量
责任链模式(Chain of Responsibility Pattern),也称为行为型设计模式,在软件工程领域具有重要地位。它提供了一种机制,在需要时动态地将任务分配给不同的处理器对象,并按照预定义的顺序进行传递。这种设计方法特别适合那些需要灵活应对复杂需求的应用场景。在这一模式下,默认情况下只有最后一个处理器对象具备接收任务的能力,并且一旦某个处理器能够接受并执行该任务,则整个任务流程就此终止;如果当前处理器无法完成任务,则会依次将任务分配给后面的每一个处理器直至找到合适的接收方为止。这种机制不仅实现了任务分配的解耦功能,在提高系统运行效率的同时还增强了系统运行的灵活性与可扩展性
一、基础
1 意图
- 避免使发送者与接收者的耦合程度降低
- 确保每个目标都能独立处理请求
- 将多个目标按顺序排列并传递请求
2 适用场景
- 多个目标均可执行请求处理,并且其具体由哪个目标执行将在运行时自动确定
- 无需明确指定接收者的多对一通信机制。
- 可以灵活地安排一组目标来接收这些请求。
- 这些常见场景包括审批流程、异常处理以及过滤器链等多种情况。
3 结构
- 抽象管理器(Handler):负责管理与客户端交互的接口,并包含了发起事务的基本逻辑。
- 具体实现(ConcreteHandler):继承并实现了父类的所有功能与属性。当该实例能够响应相关事务时会自动执行操作。
- 客户端(Client):通过创建事务并将之提交至责任链的第一个实例。
二、进阶
1 责任链模式的优点
- 减少相互依赖程度:发送方无需了解具体处理方的身份
- 提升系统灵活性:能够灵活调整链中的处理方位置
- 符合开闭原则:遵循开闭原则而无需修改现有代码
- 责任划分更加灵活:能够自由组合不同的处理流程
2 责任链模式的缺点
- 请求可能存在未被正确处理的情况(可以通过合理的默认值设置来应对)
- 调试过程较为复杂(因为请求的传递方式并不明确)
- 可能导致性能下降(当消息链过长时会导致系统响应变慢)
3 责任链模式的应用
- 这个Servlet过滤器模块
- 基于Spring Security的滤镜组件架构
- 统一消息队列系统
- 统一审批流程(例如用于请假申请)
- 错误处理机制
三、关键技术
1 链的构建方式
静态构建:编译时确定处理链
动态构建:运行时根据需要构建处理链
配置文件驱动:通过外部配置定义处理链
2 请求传递机制
自动传递:处理者处理完后自动调用下一个
手动传递:处理者显式调用下一个
条件传递:根据处理结果决定是否继续
四、易错点
1 常见错误
忘记设置后继处理者导致链断裂
循环引用导致无限循环
未正确处理请求未被处理的情况
链过长导致性能问题
2 注意事项
确保链的完整性(至少有一个默认处理者)
控制链的长度(建议3-5个处理者)
考虑使用组合模式管理复杂链结构
合理设计请求对象(包含足够上下文信息)
五、核心代码
1 基础实现
// 请求类
class PurchaseRequest {
public:
int amount;
string purpose;
PurchaseRequest(int amt, const string& pur)
: amount(amt), purpose(pur) {}
};
// 抽象处理者
class Approver {
protected:
Approver* successor;
public:
Approver() : successor(nullptr) {}
void setSuccessor(Approver* app) {
successor = app;
}
virtual void processRequest(PurchaseRequest& req) = 0;
};
// 具体处理者:经理
class Manager : public Approver {
public:
void processRequest(PurchaseRequest& req) override {
if (req.amount <= 5000) {
cout << "Manager approves $" << req.amount
<< " for " << req.purpose << endl;
} else if (successor) {
successor->processRequest(req);
}
}
};
// 具体处理者:总监
class Director : public Approver {
public:
void processRequest(PurchaseRequest& req) override {
if (req.amount <= 10000) {
cout << "Director approves $" << req.amount
<< " for " << req.purpose << endl;
} else if (successor) {
successor->processRequest(req);
}
}
};
// 使用示例
int main() {
Manager manager;
Director director;
manager.setSuccessor(&director);
PurchaseRequest req1(4000, "Office supplies");
PurchaseRequest req2(8000, "Team building");
PurchaseRequest req3(15000, "New equipment");
manager.processRequest(req1);
manager.processRequest(req2);
manager.processRequest(req3); // 未被处理
return 0;
}
5.2 高级实现(带中断和默认处理)
class DefaultApprover : public Approver {
public:
void processRequest(PurchaseRequest& req) override {
cout << "Request for $" << req.amount
<< " requires board approval!" << endl;
}
};
class VicePresident : public Approver {
public:
void processRequest(PurchaseRequest& req) override {
if (req.purpose == "Emergency") {
cout << "VP approves emergency $" << req.amount << endl;
return; // 中断处理链
}
if (req.amount <= 20000) {
cout << "VP approves $" << req.amount << endl;
} else if (successor) {
successor->processRequest(req);
}
}
};
// 使用示例
int main() {
Manager manager;
VicePresident vp;
DefaultApprover defaultApp;
manager.setSuccessor(&vp);
vp.setSuccessor(&defaultApp);
PurchaseRequest req1(4000, "Office supplies");
PurchaseRequest req2(25000, "Emergency");
PurchaseRequest req3(30000, "New project");
manager.processRequest(req1);
manager.processRequest(req2); // 被VP处理并中断
manager.processRequest(req3); // 由默认处理者处理
return 0;
}
六、总结
该模式是一种极具影响力的的行为设计范式,在软件系统中被广泛采用。这种架构通过将多个处理单元串联成一个链条来实现对请求发源和接收的解耦,在实际应用中表现出极强的灵活性与可扩展性。特别适用于那些需要动态决定请求处理对象的场景,包括但不限于审批流程,事件响应机制等复杂业务逻辑的设计与实现
全部评论 (0)
还没有任何评论哟~
