文档章节

C 语言-- 原型设计模式

小张525
 小张525
发布于 2017/05/16 22:19
字数 552
阅读 5
收藏 0
// main.h
#ifndef _MAIN_H
#define _MAIN_H

typedef 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}

 

© 著作权归作者所有

共有 人打赏支持
小张525
粉丝 6
博文 103
码字总数 33503
作品 0
乌鲁木齐
程序员
私信 提问
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
JavaScript设计模式入坑

JavaScript设计模式入坑 介绍 设计模式编写易于维护的代码。 设计模式的开创者是一位土木工程师。Σ( ° △ °|||)︴,写代码就是盖房子。 模式 模式一种可以复用的解决方案。解决软件设计中...

小小小8021
10/18
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

防御CSRF攻击

跨站请求伪造(CSRF)是一种安全漏洞,攻击者利用受害者的 session 来通过受害者的浏览器发出请求。攻击者通过受害者的浏览器发送请求,并伪造成是受害者自己发出的请求。 建议你先熟悉CSRF,...

Landas
19分钟前
0
0
【双12首发】终于等来了!PhalApi-iView-admin 开源后台框架

PhalApi-iView-admin 开源后台框架 码云地址:https://gitee.com/dogstar/phalapi-iview-admin Github地址:https://github.com/phalapi/phalapi-iview-admin 主要采用的技术: PhalApi 开源......

暗夜在火星
19分钟前
0
0
JavaScript面试题大坑之隐式类型转换实例代码

1.1-隐式转换介绍 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算 这种无需程序员手...

peakedness丶
21分钟前
0
0
示例vue 的keep-alive缓存功能的实现

本篇文章主要介绍了vue 的keep-alive缓存功能的实现,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 #Vue 实现组件信息的缓存 当...

前端攻城老湿
22分钟前
0
0
解析Vue.js中的computed工作原理

我们通过实现一个简单版的和Vue中computed具有相同功能的函数来了解computed是如何工作的。写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批...

前端攻城小牛
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部