| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| |
| |
| typedef struct Handler { |
| struct Handler* nextHandler; |
| void (*handleRequest)(struct Handler* handler, int request); |
| void (*setNextHandler)(struct Handler* CurHandler, struct Handler* NextHandler); |
| } Handler; |
| void setNextHandler(struct Handler* CurHandler, struct Handler* NextHandler) |
| { |
| if (!CurHandler) { |
| printf("handler is null\n"); |
| return; |
| } |
| CurHandler->nextHandler = NextHandler; |
| } |
| |
| |
| typedef struct ConcreteHandler1 { |
| Handler handler; |
| } ConcreteHandler1; |
| void ConcreteHandler1_handleRequest(Handler* handler, int request) { |
| if (request >= 0 && request < 10) { |
| printf("ConcreteHandler1 处理请求 %d\n", request); |
| } else if (handler->nextHandler != NULL) { |
| |
| handler->nextHandler->handleRequest(handler->nextHandler, request); |
| } else { |
| printf("无法处理请求 %d\n", request); |
| } |
| } |
| |
| |
| typedef struct ConcreteHandler2 { |
| Handler handler; |
| } ConcreteHandler2; |
| void ConcreteHandler2_handleRequest(Handler* handler, int request) { |
| if (request >= 10 && request < 20) { |
| printf("ConcreteHandler2 处理请求 %d\n", request); |
| } else if (handler->nextHandler != NULL) { |
| |
| handler->nextHandler->handleRequest(handler->nextHandler, request); |
| } else { |
| printf("无法处理请求 %d\n", request); |
| } |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| |
| ConcreteHandler1* handler1 = (ConcreteHandler1*)malloc(sizeof(ConcreteHandler1)); |
| ConcreteHandler2* handler2 = (ConcreteHandler2*)malloc(sizeof(ConcreteHandler2)); |
| |
| handler1->handler.handleRequest = ConcreteHandler1_handleRequest; |
| handler1->handler.setNextHandler = setNextHandler; |
| handler1->handler.setNextHandler(&handler1->handler, &handler2->handler); |
| |
| handler2->handler.handleRequest = ConcreteHandler2_handleRequest; |
| handler1->handler.setNextHandler = setNextHandler; |
| handler1->handler.setNextHandler(&handler2->handler, NULL); |
| |
| |
| int requests[] = {5, 12, 18, 25}; |
| int i; |
| for (i = 0; i < sizeof(requests) / sizeof(int); i++) { |
| handler1->handler.handleRequest((Handler*)handler1, requests[i]); |
| } |
| |
| |
| free(handler1); |
| free(handler2); |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示