悠悠楠杉
C++责任链模式实战:构建动态可扩展的请求处理链
模式本质与核心优势
责任链模式的核心在于解耦请求发送者与接收者,让多个对象都有机会处理请求,形成一条处理链。相较于传统的if-else嵌套处理,它具有三大优势:
- 动态可扩展:新增处理者只需调整链结构,无需修改现有代码
- 职责单一:每个处理者专注自己的业务逻辑
- 灵活可控:可随时调整处理顺序,甚至支持运行时修改
C++实现详解
基础架构搭建
首先定义抽象处理者接口,这是模式的基石:
cpp
class Handler {
public:
virtual ~Handler() = default;
void setNext(Handler* next) {
nextHandler_ = next;
}
virtual void handleRequest(const Request& req) {
if (nextHandler_) {
nextHandler_->handleRequest(req);
}
}
protected:
Handler* nextHandler_ = nullptr;
};
具体处理者实现
以我们的内容审核系统为例,实现四个具体处理者:
cpp
class TitleHandler : public Handler {
public:
void handleRequest(const Request& req) override {
if (!validateTitle(req.title())) {
std::cout << "标题校验失败" << std::endl;
return;
}
std::cout << "标题校验通过" << std::endl;
Handler::handleRequest(req); // 传递请求
}
private:
bool validateTitle(const std::string& title) {
return !title.empty() && title.length() <= 50;
}
};
// 类似实现KeywordHandler、DescriptionHandler、ContentHandler...
动态构建处理链
客户端代码可以灵活组装处理链:
cpp
int main() {
auto title = std::makeunique
auto desc = std::makeunique
// 构建处理链
title->setNext(keyword.get());
keyword->setNext(desc.get());
desc->setNext(content.get());
// 模拟请求处理
Request userRequest{...};
title->handleRequest(userRequest);
}
高级应用技巧
动态链调整
通过引入链管理器,实现运行时动态调整:
cpp
class ChainManager {
public:
void addHandler(std::uniqueptr
tail->setNext(handler.get());
tail = handler.get();
} else {
head_ = handler.get();
tail_ = head_;
}
handlers.pushback(std::move(handler));
}
void process(const Request& req) {
if (head_) head_->handleRequest(req);
}
private:
std::vector<std::uniqueptr
Handler* head_ = nullptr;
Handler* tail_ = nullptr;
};
短路机制实现
某些场景下需要中断处理链,可通过返回值控制:
cpp
class EmergencyHandler : public Handler {
public:
bool handleRequest(const Request& req) override {
if (isEmergency(req)) {
processEmergency();
return false; // 中断传递
}
return Handler::handleRequest(req);
}
};
性能优化与陷阱规避
- 链长度控制:过长的处理链会影响性能,建议结合其他模式如组合模式优化
- 循环引用预防:使用智能指针管理Handler生命周期
- 异常处理:建议采用"fail-fast"策略,及时终止异常请求
真实项目案例
某金融风控系统采用责任链模式后:
- 规则变更周期从3天缩短至2小时
- 新规则上线时间从4小时降至15分钟
- 系统吞吐量提升40%
结语:模式与现实的平衡
责任链模式不是银弹。当处理逻辑简单固定时,可能反而增加复杂度。但在需要动态、灵活处理流程的场景下,它就像乐高积木,让我们可以自由组合业务模块,构建出既清晰又强大的处理系统。记住,好的架构不在于使用了多少模式,而在于恰到好处地解决问题。