文档章节

C 语言-- 原型设计模式

小张525
 小张525
发布于 2017/05/16 22:19
字数 552
阅读 5
收藏 0
点赞 0
评论 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
博文 59
码字总数 32032
作品 0
乌鲁木齐
程序员
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信 ⋅ 03/22 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

【设计模式】——命令模式

【情景展示】 在网络出现之前,我们的日常生活中,人与人的交际,一般使用语言沟通,然而社会在进步,随着城市化进程的加快,我们的生活发生了巨大的变化,如今的社会,人与人之间的交流方式...

u013043341 ⋅ 02/02 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

JavaScript 中常见设计模式-单例模式

     单例模式两个条件   确保只有一个实例   可以全局访问   适用   适用于弹框的实现,全局缓存   实现单例模式      JavaScript 中的单例模式   因为 JavaScript 是无...

webstack前端栈 ⋅ 05/19 ⋅ 0

【软考学习】设计模式——解释器模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 解释器设计模式总结: 一、定义:给定一个语言,定义它的文法的一种表示,并定...

yym15732626210 ⋅ 01/31 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

设计模式分类与原则

创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(...

晨猫 ⋅ 03/12 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 7分钟前 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 10分钟前 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 11分钟前 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 13分钟前 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 21分钟前 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 49分钟前 ⋅ 0

彻底删除Microsoft Office的方法

参照此链接彻底删除Office https://support.office.com/zh-cn/article/%e4%bb%8e-pc-%e5%8d%b8%e8%bd%bd-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-CN&rs=zh-CN&ad=CN......

Kampfer ⋅ 今天 ⋅ 0

大盘与个股之间关系

大盘走多:积极出手 顺势加码 大盘走空: 少量出手 退场观望 大盘做头:逆势减码 少量操作 大盘做底 : 小量建仓 小量试单

guozenhua ⋅ 今天 ⋅ 0

Day16 LVM(逻辑卷管理)与磁盘故障小案例

lvm详解 简述 LVM的产生是因为传统的分区一旦分区好后就无法在线扩充空间,也存在一些工具能实现在线扩充空间但是还是会面临数据损坏的风险;传统的分区当分区空间不足时,一般的解决办法是再...

杉下 ⋅ 今天 ⋅ 0

rsync实现多台linux服务器的文件同步

一、首先安装rsync,怎样安装都行,rpm,yum,还是你用源码安装都可以。因为我用的是阿里云的ESC,yum install rsync就ok了。 二、配置rsync服务 1.先建立个同步数据的帐号 123 groupadd r...

在下头真的很硬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部