文档章节

C 语言-- 原型设计模式

小张525
 小张525
发布于 2017/05/16 22:19
字数 552
阅读 5
收藏 0
// main.h
#ifndef _MAIN_H
#define _MAIN_H

typedef struct _AdvTemplate AdvTemplate;
struct _AdvTemplate
{
	char acAdvSubject[50];
	char acAdvContext[50];

	char* (*getAdvSubject)(AdvTemplate *pAdvTemplate);
	char* (*getAdvContext)(AdvTemplate *pAdvTemplate);

	void (*DeleteAdvTemplate)(AdvTemplate *pAdvTemplate);
};


typedef struct _Mail Mail;
struct _Mail
{
	char receiver[20];
	char subject[50];
	char appellation[20];
	char context[50];
	char tail[20];

	AdvTemplate *pAdvTemplate;

	Mail*(*CloneMail)(Mail *pMail);


	char* (*getReceiver)(Mail *pMail);
	void (*setReceiver)(char *pString,Mail *pMail);
	void (*setAppellation)(char *pString,Mail *pMail);
	void (*setTail)(char *pString,Mail *pMail);

	void (*DeleteMail)(Mail *pMail);

};


#endif


// main.h

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


char* getAdvSubject(AdvTemplate *pAdvTemplate)
{
	return pAdvTemplate->acAdvSubject;
}

char* getAdvContext(AdvTemplate *pAdvTemplate)
{
	return pAdvTemplate->acAdvContext;
}


void DeleteAdvTemplate(AdvTemplate *pAdvTemplate)
{
	if(pAdvTemplate != NULL)
	{
		free(pAdvTemplate);
		pAdvTemplate=NULL;
	}
}

AdvTemplate *CreateAdvTemplate(void)
{
	AdvTemplate *pAdvTemplate = (AdvTemplate*)malloc(sizeof(AdvTemplate));

	if(!pAdvTemplate)
	{
		return NULL;
	}

	memset(pAdvTemplate,0,sizeof(AdvTemplate));
	strcpy(pAdvTemplate->acAdvSubject,"This is subject");
	strcpy(pAdvTemplate->acAdvContext,"This is context");


	pAdvTemplate->getAdvSubject=getAdvSubject;
	pAdvTemplate->getAdvContext=getAdvContext;
	pAdvTemplate->DeleteAdvTemplate=DeleteAdvTemplate;

	return pAdvTemplate;
}


char* getReceiver(Mail *pMail)
{
	return pMail->receiver;
}

void setReceiver(char* pString,Mail *pMail)
{
	if(pString)
	{
		strcpy(pMail->receiver,pString);
	}
}

void setAppelltion(char* pString,Mail *pMail)
{
	if(pString)
	{
		strcpy(pMail->appellation,pString);
	}
}

void setTail(char *pString,Mail *pMail)
{
	if(pString)
	{
		strcpy(pMail->tail,pString);
	}
}

// 指向和预留空间的区别是什么.
Mail *CloneMail(Mail *pMail)
{
	Mail *pCloneMail = (Mail*)malloc(sizeof(Mail));
	if(pCloneMail)
	{
		memcpy(pCloneMail,pMail,sizeof(Mail));
	}
	return pCloneMail;
}


/**
	注意释放的过程, 先释放父类上的内容,
	在释放当前.
	需要与free操作做对比测试.
**/
void DeleteMail(Mail *pMail)
{
    
    if(pMail->pAdvTemplate)
    {
        pMail->pAdvTemplate->DeleteAdvTemplate(pMail->pAdvTemplate);
    }
    if(pMail)
    {
        free(pMail);
        pMail = NULL;
    }
}



Mail *CreateMail(void)
{
    Mail *pMail = (Mail *)malloc(sizeof(Mail));
    if(!pMail)
    {
        return NULL;
    }
    memset(pMail, 0, sizeof(Mail));
    pMail->pAdvTemplate = CreateAdvTemplate();
    if(!pMail->pAdvTemplate)
    {
        return NULL;
    }
    pMail->setAppellation = setAppelltion;
    pMail->setReceiver = setReceiver;
    pMail->setTail = setTail;
    pMail->getReceiver = getReceiver;
    pMail->DeleteMail = DeleteMail;
    pMail->CloneMail = CloneMail;
    strcpy(pMail->context,pMail->pAdvTemplate->acAdvContext);
    strcpy(pMail->subject,pMail->pAdvTemplate->acAdvSubject);
    return pMail;
}

char *GetAppell()
{
    return "abc";
}


char *GetReceiver()
{
    return "abc";
}


void sendMail(Mail *pMail,int i)
{
	printf("=======================================\r\n");
	printf("receiver:%d---%s\r\n",i,pMail->getReceiver(pMail));
	printf("subject:%s\r\n",pMail->subject);
	printf("appellation:%s\r\n",pMail->appellation);
	printf("context:%s\r\n",pMail->context);
	printf("=======================================\r\n");
}

int main()
{
	int max_count = 6; /*发送信件的数量*/
	int i=1;
    Mail *pMail = NULL;
    Mail *pCloneMail = NULL;

	pMail = CreateMail();
    pMail->setTail("xxx copyright.", pMail);

	while(max_count)
    {
        max_count--;
        
        /*克隆出一封Mail*/
        pCloneMail = pMail->CloneMail(pMail); 


        /*设置每封Mail的不同部分*/
        pCloneMail->setAppellation(GetAppell(), pCloneMail);
        pCloneMail->setReceiver(GetReceiver(), pCloneMail);


        /*发送邮件*/
		sendMail(pCloneMail,i);

		//pCloneMail->DeleteMail(pCloneMail);
		// 此处不要调用DeleteMail()操作, 主要的原因是因为父类中的内会被修改.导致克隆的数据不可用.
		// free只释放克隆时申请的空间, 不修改父类中的的信息. 是的程序服务调用父类中 的释放操作.
        free(pCloneMail);
		i++;
    }


    pMail->DeleteMail(pMail);
	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
小张525
粉丝 6
博文 100
码字总数 32277
作品 0
乌鲁木齐
程序员
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
1
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
6
2
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部