#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*C语言实现设计模式之禅之原型模式, 类图见p139*/
/*核心思想: 给类中添加一个拷贝自身的函数,在用的时候可以创建数据相同的类!*/
/*chengrile原创,转载注明出处*/
/*广告信类*/
typedef struct _AdvTemplate AdvTemplate;
struct _AdvTemplate
{
char acAdvSubject[50]; /*广告信主题*/
char acAdvContext[50]; /*广告信正文*/
char *(*getAdvSubject)(AdvTemplate *pAdvTemplate);
char *(*getAdvContext)(AdvTemplate *pAdvTemplate);
void (*DeleteAdvTemplate)(AdvTemplate *pAdvTemplate);
};
void DeleteAdvTemplate(AdvTemplate *pAdvTemplate)
{
if(pAdvTemplate)
{
free(pAdvTemplate);
pAdvTemplate = NULL;
}
}
char *getAdvSubject(AdvTemplate *pAdvTemplate)
{
return pAdvTemplate->acAdvContext;
}
char *getAdvContext(AdvTemplate *pAdvTemplate)
{
return pAdvTemplate->acAdvContext;
}
AdvTemplate *CreateAdvTemplate(void)
{
AdvTemplate *pAdvTemplate = (AdvTemplate *)malloc(sizeof(AdvTemplate));
if(!pAdvTemplate)
{
return NULL;
}
memset(pAdvTemplate, 0, sizeof(AdvTemplate));
strcpy(pAdvTemplate->acAdvContext, "AdvContext is ...");
strcpy(pAdvTemplate->acAdvSubject, "This is a subject...");
pAdvTemplate->getAdvSubject = getAdvSubject;
pAdvTemplate->getAdvContext = getAdvContext;
pAdvTemplate->DeleteAdvTemplate = DeleteAdvTemplate;
return pAdvTemplate;
}
/*邮件类*/
typedef struct _Mail Mail;
struct _Mail
{
char receiver[20]; //收件人
char subject[50]; //主题
char appellation[20]; //称谓
char contxt[50]; //内容
char tail[20]; //邮件尾部
AdvTemplate *pAdvTemplate; /*嵌入广告信*/
/*克隆自身的方法*/
Mail *(*CloneMail)(Mail *pMail);
/*以下是getter/setter方法*/
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);
};
char *getReceiver(Mail *pMail)
{
return pMail->receiver;
}
void setReceiver(char *pString, Mail *pMail)
{
if(pString)
{
//override check ...
strcpy(pMail->receiver, pString);
}
}
void setAppellation(char *pString, Mail *pMail)
{
if(pString)
{
//override check ...
strcpy(pMail->appellation, pString);
}
}
void setTail(char *pString, Mail *pMail)
{
if(pString)
{
//override check ...
strcpy(pMail->tail, pString);
}
}
Mail *CloneMail(Mail *pMail)
{
Mail *pCloneMail = (Mail *)malloc(sizeof(Mail));
if(pCloneMail)
{
memcpy(pCloneMail, pMail, sizeof(Mail));
}
return pCloneMail;
}
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 = setAppellation;
pMail->setReceiver = setReceiver;
pMail->setTail = setTail;
pMail->getReceiver = getReceiver;
pMail->DeleteMail = DeleteMail;
pMail->CloneMail = CloneMail;
strcpy(pMail->contxt,pMail->pAdvTemplate->acAdvContext);
strcpy(pMail->subject,pMail->pAdvTemplate->acAdvSubject);
return pMail;
}
/*场景*/
char *GetAppell()
{
return "abc";
}
char *GetReceiver()
{
return "abc";
}
void sendMail(Mail *pMail)
{
}
void main(void)
{
int max_count = 6; /*发送信件的数量*/
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);
//pCloneMail->DeleteMail(pCloneMail);
free(pCloneMail);
}
pMail->DeleteMail(pMail);
}
#include <stdlib.h>
#include <string.h>
/*C语言实现设计模式之禅之原型模式, 类图见p139*/
/*核心思想: 给类中添加一个拷贝自身的函数,在用的时候可以创建数据相同的类!*/
/*chengrile原创,转载注明出处*/
/*广告信类*/
typedef struct _AdvTemplate AdvTemplate;
struct _AdvTemplate
{
char acAdvSubject[50]; /*广告信主题*/
char acAdvContext[50]; /*广告信正文*/
char *(*getAdvSubject)(AdvTemplate *pAdvTemplate);
char *(*getAdvContext)(AdvTemplate *pAdvTemplate);
void (*DeleteAdvTemplate)(AdvTemplate *pAdvTemplate);
};
void DeleteAdvTemplate(AdvTemplate *pAdvTemplate)
{
if(pAdvTemplate)
{
free(pAdvTemplate);
pAdvTemplate = NULL;
}
}
char *getAdvSubject(AdvTemplate *pAdvTemplate)
{
return pAdvTemplate->acAdvContext;
}
char *getAdvContext(AdvTemplate *pAdvTemplate)
{
return pAdvTemplate->acAdvContext;
}
AdvTemplate *CreateAdvTemplate(void)
{
AdvTemplate *pAdvTemplate = (AdvTemplate *)malloc(sizeof(AdvTemplate));
if(!pAdvTemplate)
{
return NULL;
}
memset(pAdvTemplate, 0, sizeof(AdvTemplate));
strcpy(pAdvTemplate->acAdvContext, "AdvContext is ...");
strcpy(pAdvTemplate->acAdvSubject, "This is a subject...");
pAdvTemplate->getAdvSubject = getAdvSubject;
pAdvTemplate->getAdvContext = getAdvContext;
pAdvTemplate->DeleteAdvTemplate = DeleteAdvTemplate;
return pAdvTemplate;
}
/*邮件类*/
typedef struct _Mail Mail;
struct _Mail
{
char receiver[20]; //收件人
char subject[50]; //主题
char appellation[20]; //称谓
char contxt[50]; //内容
char tail[20]; //邮件尾部
AdvTemplate *pAdvTemplate; /*嵌入广告信*/
/*克隆自身的方法*/
Mail *(*CloneMail)(Mail *pMail);
/*以下是getter/setter方法*/
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);
};
char *getReceiver(Mail *pMail)
{
return pMail->receiver;
}
void setReceiver(char *pString, Mail *pMail)
{
if(pString)
{
//override check ...
strcpy(pMail->receiver, pString);
}
}
void setAppellation(char *pString, Mail *pMail)
{
if(pString)
{
//override check ...
strcpy(pMail->appellation, pString);
}
}
void setTail(char *pString, Mail *pMail)
{
if(pString)
{
//override check ...
strcpy(pMail->tail, pString);
}
}
Mail *CloneMail(Mail *pMail)
{
Mail *pCloneMail = (Mail *)malloc(sizeof(Mail));
if(pCloneMail)
{
memcpy(pCloneMail, pMail, sizeof(Mail));
}
return pCloneMail;
}
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 = setAppellation;
pMail->setReceiver = setReceiver;
pMail->setTail = setTail;
pMail->getReceiver = getReceiver;
pMail->DeleteMail = DeleteMail;
pMail->CloneMail = CloneMail;
strcpy(pMail->contxt,pMail->pAdvTemplate->acAdvContext);
strcpy(pMail->subject,pMail->pAdvTemplate->acAdvSubject);
return pMail;
}
/*场景*/
char *GetAppell()
{
return "abc";
}
char *GetReceiver()
{
return "abc";
}
void sendMail(Mail *pMail)
{
}
void main(void)
{
int max_count = 6; /*发送信件的数量*/
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);
//pCloneMail->DeleteMail(pCloneMail);
free(pCloneMail);
}
pMail->DeleteMail(pMail);
}