责任链模式:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系。 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有对象处理它为止。 )
#include <stdio.h>
#include <stdlib.h>
// 定义请求结构体
typedef struct {
int amount;
} Request;
// 定义处理对象结构体
typedef struct Handler {
void (*handleRequest)(struct Handler* handler, Request* request);
struct Handler* nextHandler;
} Handler;
// 处理对象1
void handler1_handleRequest(Handler* handler, Request* request) {
if (request->amount <= 100) {
printf("Handler 1 handles the request.\n");
} else if (handler->nextHandler != NULL) {
handler->nextHandler->handleRequest(handler->nextHandler, request);
}
}
// 处理对象2
void handler2_handleRequest(Handler* handler, Request* request) {
if (request->amount > 100 && request->amount <= 500) {
printf("Handler 2 handles the request.\n");
} else if (handler->nextHandler != NULL) {
handler->nextHandler->handleRequest(handler->nextHandler, request);
}
}
// 处理对象3
void handler3_handleRequest(Handler* handler, Request* request) {
if (request->amount > 500) {
printf("Handler 3 handles the request.\n");
} else if (handler->nextHandler != NULL) {
handler->nextHandler->handleRequest(handler->nextHandler, request);
}
}
int main() {
// 创建处理对象
Handler* handler1 = (Handler*)malloc(sizeof(Handler));
Handler* handler2 = (Handler*)malloc(sizeof(Handler));
Handler* handler3 = (Handler*)malloc(sizeof(Handler));
// 设置处理函数和下一个处理对象
handler1->handleRequest = handler1_handleRequest;
handler1->nextHandler = handler2;
handler2->handleRequest = handler2_handleRequest;
handler2->nextHandler = handler3;
handler3->handleRequest = handler3_handleRequest;
handler3->nextHandler = NULL;
// 创建请求
Request request1 = {50};
Request request2 = {200};
Request request3 = {1000};
// 处理请求
handler1->handleRequest(handler1, &request1);
handler1->handleRequest(handler1, &request2);
handler1->handleRequest(handler1, &request3);
// 释放内存
free(handler1);
free(handler2);
free(handler3);
return 0;
}
此示例实现了一个简单的责任链模式,有三个处理对象(handler1、handler2和handler3),每个处理对象都可以选择处理请求或将其传递给下一个处理对象。每个处理对象都具有一个处理请求的函数指针,并且可以通过nextHandler
字段连接到下一个处理对象。
请求处理:当一个请求需要经过多个处理对象进行处理时,可以使用责任链模式。每个处理对象都有自己的处理逻辑,并可以选择将请求传递给下一个处理对象或者终止处理。
日志记录:在日志记录系统中,可以使用责任链模式来实现不同级别的日志记录。例如,可以定义一个处理对象链,其中包含了不同级别的日志处理对象,从低级别到高级别。每个处理对象根据自己的级别来判断是否要处理该日志消息。
身份认证:在身份认证系统中,可以使用责任链模式来验证用户的身份。可以创建一个处理对象链,其中包含了不同的身份验证处理对象,如用户名密码验证、二次验证等。每个处理对象根据自己的验证规则来判断是否通过验证,如果验证失败,则可以选择终止验证或将请求传递给下一个处理对象。
缓存处理:在缓存系统中,可以使用责任链模式来处理缓存。可以创建一个处理对象链,其中包含了多个缓存处理对象,如本地缓存、分布式缓存等。每个处理对象根据自己的策略来判断是否有缓存可用,如果有,则返回缓存数据,否则将请求传递给下一个处理对象。
错误处理:在错误处理系统中,可以使用责任链模式来处理不同类型的错误。可以创建一个处理对象链,其中包含了多个错误处理对象,如日志记录、发送错误报告等。每个处理对象根据自己的处理逻辑来判断是否能够处理该错误,如果不能,则将错误传递给下一个处理对象。
版本号处理