C语言实现《设计模式之禅》——原型模式

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值