C语言实现的责任链模式,如何构建长尾词处理链?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1373个文字,预计阅读时间需要6分钟。
许多新颖的设计模式,对责任链模式一知半解。以C++为例,简单分享如下:
责任链模式允许多个对象处理请求,避免请求发送者和接收者之间的耦合。它通过将请求传递给链中的对象来处理请求,直到找到处理它的对象。
例如,在一个C++程序中,我们可以创建一个责任链,其中每个对象都负责处理特定类型的请求。当请求到来时,它会沿着链传递,直到找到能够处理它的对象。
cpp#include #include
// 抽象处理者class Handler {public: virtual void handleRequest(int request)=0; virtual ~Handler() {}};
// 具体处理者Aclass ConcreteHandlerA : public Handler {public: void handleRequest(int request) override { if (request <10) { std::cout << ConcreteHandlerA handles request << request << std::endl; } else { std::cout << ConcreteHandlerA can't handle request << request << , passing to next handler
void setSuccessor(Handler* successor) { this->successor=successor; }
private: Handler* successor=nullptr;};
// 具体处理者Bclass ConcreteHandlerB : public Handler {public: void handleRequest(int request) override { if (request >=10 && request <20) { std::cout << ConcreteHandlerB handles request << request << std::endl; } else { std::cout << ConcreteHandlerB can't handle request << request << , passing to next handler void setSuccessor(Handler* successor) { this->successor=successor; } private: Handler* successor=nullptr;}; // 客户端代码int main() { ConcreteHandlerA handlerA; ConcreteHandlerB handlerB; handlerA.setSuccessor(&handlerB); handlerA.handleRequest(5); handlerA.handleRequest(15); handlerA.handleRequest(25); return 0;} 在这个例子中,`ConcreteHandlerA`和`ConcreteHandlerB`是具体处理者,它们各自处理一部分请求。如果请求不在它们的能力范围内,它们会将请求传递给链中的下一个处理者。这样,每个对象都只关心自己的处理逻辑,而不需要知道其他对象的存在。 好多新学设计模式的同学,对责任链模式一知半解,今天以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。然后,我们发送三个请求,并观察输出结果。
本文共计1373个文字,预计阅读时间需要6分钟。
许多新颖的设计模式,对责任链模式一知半解。以C++为例,简单分享如下:
责任链模式允许多个对象处理请求,避免请求发送者和接收者之间的耦合。它通过将请求传递给链中的对象来处理请求,直到找到处理它的对象。
例如,在一个C++程序中,我们可以创建一个责任链,其中每个对象都负责处理特定类型的请求。当请求到来时,它会沿着链传递,直到找到能够处理它的对象。
cpp#include #include
// 抽象处理者class Handler {public: virtual void handleRequest(int request)=0; virtual ~Handler() {}};
// 具体处理者Aclass ConcreteHandlerA : public Handler {public: void handleRequest(int request) override { if (request <10) { std::cout << ConcreteHandlerA handles request << request << std::endl; } else { std::cout << ConcreteHandlerA can't handle request << request << , passing to next handler
void setSuccessor(Handler* successor) { this->successor=successor; }
private: Handler* successor=nullptr;};
// 具体处理者Bclass ConcreteHandlerB : public Handler {public: void handleRequest(int request) override { if (request >=10 && request <20) { std::cout << ConcreteHandlerB handles request << request << std::endl; } else { std::cout << ConcreteHandlerB can't handle request << request << , passing to next handler void setSuccessor(Handler* successor) { this->successor=successor; } private: Handler* successor=nullptr;}; // 客户端代码int main() { ConcreteHandlerA handlerA; ConcreteHandlerB handlerB; handlerA.setSuccessor(&handlerB); handlerA.handleRequest(5); handlerA.handleRequest(15); handlerA.handleRequest(25); return 0;} 在这个例子中,`ConcreteHandlerA`和`ConcreteHandlerB`是具体处理者,它们各自处理一部分请求。如果请求不在它们的能力范围内,它们会将请求传递给链中的下一个处理者。这样,每个对象都只关心自己的处理逻辑,而不需要知道其他对象的存在。 好多新学设计模式的同学,对责任链模式一知半解,今天以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。然后,我们发送三个请求,并观察输出结果。

