博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C 语言-- 原型设计模式
阅读量:6948 次
发布时间:2019-06-27

本文共 4075 字,大约阅读时间需要 13 分钟。

hot3.png

// main.h#ifndef _MAIN_H#define _MAIN_Htypedef 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 
#include
#include
#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;}

 

转载于:https://my.oschina.net/u/1579560/blog/902250

你可能感兴趣的文章