C语言实现《设计模式之禅》——原型模式
2014-01-20 11:41
465 查看
#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);
}
相关文章推荐
- C语言实现《设计模式之禅》之工厂模式——抽象工厂
- C语言实现《设计模式之禅》之建造者模式
- C语言实现《设计模式之禅》之代理模式——普通代理
- C语言实现《设计模式之禅》之模板模式
- C语言实现《设计模式之禅》之工厂模式——标准工厂
- C语言部分函数原型实现
- BM模式匹配算法-实现(C语言)(转)
- 设计模式C++实现(5)——原型模式、模板方法模式
- 设计模式之第9章-原型模式(Java实现)
- C#原型模式之深复制实现
- 设计模式C++实现(5)——原型模式、模板方法模式
- 经典算法研究:模式匹配(子串匹配)之 BM 算法(C语言实现版)初版
- C语言分层模式实现
- BM模式匹配算法-实现(C语言)
- php实现设计模式之 原型模式
- java设计模式之原型模式,如何实现深克隆
- 23种设计模式之原型模式(创建型,5 Prototype,c++实现)
- 设计模式之原型模式 c++实现以及详解
- 设计模式--原型模式实现C++
- 【C语言】观察者模式用C语言实现