首页 > 其他分享 >设计模式DP-原型模式

设计模式DP-原型模式

时间:2024-03-28 15:14:30浏览次数:23  
标签:obj student show void 原型 Student 设计模式 clone DP

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 定义抽象接口
typedef struct interface_t
{
	struct interface_t *(*clone)(void *obj);
	void (*set)(void* obj, const char* name, int age);
	void (*show)(void* obj);
	char name[32]; 
    int age;
}Interface_t;

typedef struct student_t
{
	struct interface_t *(*clone)(void *obj);
	void (*set)(void* obj, const char* str, int age);
	void (*show)(void* obj);
	char name[32];
	int age;
}Student_t;

static void student_set(void* obj, const char* str, int age)
{
	if(!obj || !str)
		return ;
	Student_t *s = (Student_t *)obj;
	strcpy(s->name, str);
	s->age = age;
}

static void student_show(void* obj)
{
	Student_t *s = (Student_t *)obj;
	printf("显示 学生信息: 姓名[%s] 年龄[%d]\n", s->name, s->age);
}

static struct interface_t* student_clone(void *obj)
{
	if(!obj) 
		return NULL;
		
	Interface_t *iobj = (Interface_t *)malloc(sizeof(Interface_t));
	Student_t* s = (Student_t*)obj;
	iobj->show = student_show;
	iobj->set = student_set;
	iobj->clone = student_clone;
	strcpy(iobj->name, s->name);
	iobj->age = s->age;
	printf("调用clone()函数, clone Student\n");
	return iobj;
}

Student_t* constructor_student(void)
{
	Student_t* s = (Student_t*)malloc(sizeof(Student_t));
	s->clone = student_clone;
	s->set = student_set;
	s->show = student_show;
	return s;
}

int main(int argc, char *argv[])
{
	printf("原始的学生信息: \n");
	Student_t *s1 = constructor_student();
	s1->set(s1, "SS", 23);
	s1->show(s1);
	printf("\n");

	Interface_t* i1 = s1->clone(s1);
    free(s1);

	printf("调用clone(),拷贝后的信息: \n");
	i1->show(i1);
	printf("\n");

	printf("重新修改信息: ");
	i1->set(i1, "DD", 41);
	i1->show(i1);
	free(i1);
	return 0;
}

标签:obj,student,show,void,原型,Student,设计模式,clone,DP
From: https://www.cnblogs.com/starcos/p/18101720

相关文章

  • 一类适合记忆化搜索的区间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:传输层协议对比
    ......
  • 原型模式
     1.原型模式介绍创建对象的种类,并且通过拷贝这些原型,创建新的对象,无需知道如何创建的细节 2.原型模式问题:现在有一只羊tom,姓名为:tom,年龄为:1,颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊(1)传统方式解决publicclassSheep{priva......
  • DDPG强化学习算法应用到TORCS仿真平台
    一、DDPG算法介绍1.前身DQN算法在介绍DDPG算法之前,需要首先明确它的前身DQN算法。DQN(DeepQ-Network)是一种用于强化学习的深度学习算法,由DeepMind公司开发。它结合了深度学习和Q-learning算法,旨在解决复杂环境下的强化学习问题。DQN算法在解决复杂环境下的强化学习问题方面取......
  • 实例、构造函数、原型、原型对象、prototype、__proto__、原型链……
    学习原型链和原型对象,不需要说太多话,只需要给你看看几张图,你自然就懂了。prototype表示原型对象__proto__表示原型实例、构造函数和原型对象以error举例图中的error表示axios抛出的一个错误对象(实例)。宇宙的尽头是nullObject.prototype.__proto__===null......
  • ThreadPool-线程池使用及原理
    1.线程池使用方式示例代码://一池N线程Executors.newFixedThreadPool(int)//一个任务一个任务执行,一池一线程Executors.newSingleThreadExecutorO//线程池根据需求创建线程,可扩容,遇强则强Executors.newCachedThreadPool()//自定义线程池方式newThreadPoolExec......
  • 浅析JS原型链
    目录实例对象原型对象对象原型短暂总结一下constructor原型链何为原型链呢?就是实例对象和原型对象之间的链接,每一个对象都有原型,原型本身又是对象,原型又有原型,以此类推形成一个链式结构.称为原型链。这里又扯到了另外两个概念了。实例对象>>>先往下看实例对象原型对象>>......
  • 动态规划刷题(算法竞赛、蓝桥杯)--数字三角形(线性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]; ......
  • 最短Hamilton路径(状态压缩DP)
    给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1的最短Hamilton路径。Hamilton路径的定义是从 0 到 n−1不重不漏地经过每个点恰好一次。输入格式第一行输入整数 n。接下来 n 行每行 n 个整数,其中第 i 行第 j个整数表示点 i ......