本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客
模式说明
- 方案: 责任链模式将请求的发送者和接收者解耦,构成一个链条,并由多个对象对请求进行处理,直到找到合适的处理者为止。
- 优点: 实现了请求发送者和接收者的解耦,灵活性高,易于扩展,每个处理者只需关注自己的处理逻辑。
- 缺点: 会影响性能,且不易维护
本质思想:责任链模式的本质思想是将多个处理者组成一条链,依次尝试处理请求,直到找到能够处理该请求的对象为止。
实践建议:不建议使用。该模式会降低性能,且分离的处理逻辑分支,会降低代码可读性。当遇到逻辑复杂,判断分支繁琐的逻辑,我们要做的是解耦,而不是把代码简单地拆开。
示例代码
cpp
#include <iostream>
// 请求类
class Request {
public:
int value;
Request(int v) : value(v) {}
};
// 处理者接口
class Handler {
protected:
Handler* successor;
public:
Handler() : successor(nullptr) {}
void setSuccessor(Handler* handler) {
successor = handler;
}
virtual void handleRequest(const Request& req) const = 0;
};
// 具体处理者A
class ConcreteHandlerA : public Handler {
public:
void handleRequest(const Request& req) const override {
if (req.value < 10) {
std::cout << "ConcreteHandlerA handles the request." << std::endl;
} else if (successor != nullptr) {
successor->handleRequest(req);
}
}
};
// 具体处理者B
class ConcreteHandlerB : public Handler {
public:
void handleRequest(const Request& req) const override {
if (req.value >= 10 && req.value < 20) {
std::cout << "ConcreteHandlerB handles the request." << std::endl;
} else if (successor != nullptr) {
successor->handleRequest(req);
}
}
};
// 客户端代码
int main() {
// 构建责任链
Handler* handlerA = new ConcreteHandlerA();
Handler* handlerB = new ConcreteHandlerB();
handlerA->setSuccessor(handlerB);
// 发送请求
Request req1(5);
Request req2(15);
handlerA->handleRequest(req1); // 输出:ConcreteHandlerA handles the request.
handlerA->handleRequest(req2); // 输出:ConcreteHandlerB handles the request.
// 释放内存
delete handlerA;
delete handlerB;
return 0;
}