好多新学设计模式的同学,对责任链模式一知半解,今天以C++为例,做个简单的分享。
责任链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系。将这些接受处理的对象连成一条链,并沿着该链处理请求,收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
可以通过以下方式实现责任链模式:
- 创建一个抽象的处理者类或接口,包含一个处理请求的方法;
- 创建多个具体的处理者类,它们将实现处理者接口并定义自己的处理逻辑;
- 创建一个请求者类,它包含一个责任链,可以将请求传递给链上的每个处理者;
- 在请求者类中定义一个发送请求的方法,该方法将请求传递给责任链上的每个处理者,直到有一个处理者能够处理该请求。
废话不多说,上代码:
#include <iostream>
#include <list>
using namespace std;
// 抽象处理者类
abstract class Handler {
public:
virtual void handleRequest(Request request) = 0;
};
// 具体处理者类1
class ConcreteHandler1 : public Handler {
public:
void handleRequest(Request request) {
if (request == "request1") {
cout << "ConcreteHandler1 handles request1." << endl;
} else {
nextHandler->handleRequest(request);
}
}
};
// 具体处理者类2
class ConcreteHandler2 : public Handler {
public:
void handleRequest(Request request) {
if (request == "request2") {
cout << "ConcreteHandler2 handles request2." << endl;
} else {
nextHandler->handleRequest(request);
}
}
};
// 请求者类
class Requester {
public:
Requester(Handler* handler) {
handlerList.push_back(handler);
}
void sendRequest(Request request) {
handlerList.front()->handleRequest(request);
}
private:
list<Handler*> handlerList;
};
// 测试代码
int main() {
// 创建处理者对象
ConcreteHandler1 handler1;
ConcreteHandler2 handler2;
// 创建请求者对象并设置责任链
Requester requester(&handler1);
handler1.nextHandler = &handler2;
// 发送请求并传递给责任链上的处理者
requester.sendRequest("request1");
requester.sendRequest("request2");
requester.sendRequest("request3");
return 0;
}
上述代码,定义了一个抽象的处理者类Handler
,以及两个具体的处理者类ConcreteHandler1
和ConcreteHandler2
。我们还定义了一个请求者类Requester
,它包含一个责任链,可以将请求传递给链上的每个处理者。在测试代码中,我们创建了处理者对象和请求者对象,并将责任链设置为ConcreteHandler1
和ConcreteHandler2
。然后,我们发送三个请求,并观察输出结果。
什么时候使用责任链模式?
当需要将请求发送给多个对象处理时或需要动态指定处理请求的对象集合时,如果在不明确接收者的情况下,将请求发送给多个对象中的一个或多个时,可以使用责任链模式。责任链模式将发送者和接收者解耦,提高了系统的灵活性和可扩展性。