模式特点
将请求的发送者和接收者解耦,使多个对象都有机会处理请求。将这些对象连成一条链,沿着链传递请求,直到有一个对象处理它为止。
- 请求发送者不需要知道哪个接收者会处理
- 可以动态调整链的顺序和增删处理者
- 每个处理者只关心自己能处理的请求
类图
应用场景
- Qt 事件过滤器链:QApplication → QWidget → 子控件逐级处理
- 日志系统:DEBUG → INFO → WARN → ERROR 不同级别处理器
- 审批流程:组长 → 经理 → 总监逐级审批
- 机器人安全检查链:IO 检查 → 运动范围检查 → 碰撞检查
- Web 请求中间件:认证 → 权限 → 日志 → 业务处理
示例代码(C++)
class SafetyHandler { protected: SafetyHandler* m_next = nullptr; public: SafetyHandler* setNext(SafetyHandler* next) { m_next = next; return next; } virtual bool handle(const std::string& request) { if (m_next) return m_next->handle(request); std::cout << "所有检查通过" << std::endl; return true; } virtual ~SafetyHandler() = default; }; class IOCheckHandler : public SafetyHandler { public: bool handle(const std::string& req) override { if (req.find("IO") != std::string::npos) { std::cout << "[IO检查] 发现IO异常,拦截!" << std::endl; return false; } std::cout << "[IO检查] 正常" << std::endl; return SafetyHandler::handle(req); } }; class RangeCheckHandler : public SafetyHandler { public: bool handle(const std::string& req) override { if (req.find("超限") != std::string::npos) { std::cout << "[范围检查] 运动超限,拦截!" << std::endl; return false; } std::cout << "[范围检查] 正常" << std::endl; return SafetyHandler::handle(req); } }; // 构建责任链 IOCheckHandler io; RangeCheckHandler range; io.setNext(&range); io.handle("正常运动"); // 依次通过 io.handle("IO 异常"); // IO检查拦截