首页 > 其他分享 >设计模式DP-责任链模式

设计模式DP-责任链模式

时间:2024-03-28 17:01:30浏览次数:22  
标签:handler1 request 责任 handler handleRequest Handler 设计模式 DP struct

#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;
}

// 业务处理者子类1
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);
	}
}

// 业务处理者子类2
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;
}

标签:handler1,request,责任,handler,handleRequest,Handler,设计模式,DP,struct
From: https://www.cnblogs.com/starcos/p/18102103

相关文章

  • 设计模式DP-表驱动模式
    静态结构体数组式构建链表式构建链接式构建#include<stdio.h>#include<stdlib.h>#include<string.h> //加doublefun_add(doubledata_front,doubledata_back){ returndata_front+data_back;}//减doublefun_sub(doubledata_front,doubledata_back)......
  • 设计模式-----观察者模式
    一、概念1、Observer模式的概念         (Observer)被称作发布-订阅者模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能的耦合。        (Observer)模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对......
  • 设计模式DP-模版模式
    #include<stdio.h>#include<string.h>#include<stdlib.h>typedefstructInterface_t{ /*初始化外设USB、SPI、IIC等*/ void(*init_peripheral)(void*obj); /*初始化硬盘*/ void(*init_disk)(void*obj); /*初始化内存*/ void(*init_memory)(void*obj);......
  • 设计模式DP-原型模式
    #include<stdio.h>#include<string.h>#include<stdlib.h>//定义抽象接口typedefstructinterface_t{ structinterface_t*(*clone)(void*obj); void(*set)(void*obj,constchar*name,intage); void(*show)(void*obj); charname[32];......
  • 一类适合记忆化搜索的区间dp
    https://www.luogu.com.cn/problem/P5752https://codeforces.com/contest/598/problem/Ecf这个题考虑dp预处理,状态是三维的,转移是分割方案和所分块需要获得的巧克力数量。最后题目多次询问可以o(1)快速查询的//Problem:E.ChocolateBar//Contest:Codeforces-Educational......
  • 分享23种追女生的方式,教你同时把追MM和设计模式融汇贯通(下
    想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦。观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象......
  • TCP与UDP:传输层协议对比
    ......
  • DDPG强化学习算法应用到TORCS仿真平台
    一、DDPG算法介绍1.前身DQN算法在介绍DDPG算法之前,需要首先明确它的前身DQN算法。DQN(DeepQ-Network)是一种用于强化学习的深度学习算法,由DeepMind公司开发。它结合了深度学习和Q-learning算法,旨在解决复杂环境下的强化学习问题。DQN算法在解决复杂环境下的强化学习问题方面取......
  • ThreadPool-线程池使用及原理
    1.线程池使用方式示例代码://一池N线程Executors.newFixedThreadPool(int)//一个任务一个任务执行,一池一线程Executors.newSingleThreadExecutorO//线程池根据需求创建线程,可扩容,遇强则强Executors.newCachedThreadPool()//自定义线程池方式newThreadPoolExec......
  • 动态规划刷题(算法竞赛、蓝桥杯)--数字三角形(线性DP)
    1、题目链接:[USACO1.5][IOI1994]数字三角形NumberTriangles-洛谷#include<bits/stdc++.h>usingnamespacestd;intr;constintN=1010;inta[N][N];intmain(){ cin>>r; for(inti=1;i<=r;i++){ for(intj=1;j<=i;j++){ cin>>a[i][j]; ......