您的位置:首页 > 编程语言 > C语言/C++

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: