C语言实现《设计模式之禅》之代理模式——普通代理
来源:互联网 发布:澳洲上市公司数据查询 编辑:程序博客网 时间:2024/05/21 21:46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*C语言实现<设计模式之禅>之代理模式____普通代理*/
/*代理模式: 为其他对象提供一种代理以控制对这个对象的访问*/
/*普通代理: 调用者只能访问代理角色,而不能访问真实角色。 调用者只知道代理而
不用知道真实角色,屏蔽了真实角色的变更对高层模块的影响。*/
/*抽象游戏者*/
typedef struct _IGamePlayer IGamePlayer;
struct _IGamePlayer
{
void (*login)(char *pName, char *pPassword, void *);
void (*killBoss)(void *);
void (*upgrade)(void *);
void (*DeleteIGamePlayer)(void *);
};
/*游戏者*/
typedef struct _GamePlayer GamePlayer;
struct _GamePlayer
{
IGamePlayer gmplayer; /*继承抽象游戏者*/
char acName[10];
void (*DeleteGamePlayer)(GamePlayer *pGamePlayer);
};
void login(char *pName, char *pPassword, void *pGamePlayer)
{
printf("user :%s is login in !\n", pName);
}
void killBoss(void *pGamePlayer)
{
printf("%s is killing the boss! \n", ((GamePlayer *)pGamePlayer)->acName);
}
void upgrade(void *pGamePlayer)
{
printf("%s is upgrading !\n", ((GamePlayer *)pGamePlayer)->acName);
}
void DeleteGamePlayer(GamePlayer *pGamePlayer)
{
if(pGamePlayer)
{
free(pGamePlayer);
pGamePlayer = NULL;
}
}
GamePlayer *CreateGamePlayer(IGamePlayer *pIGamePlayer, char *pName)
{
GamePlayer *pGamePlayer = NULL;
if(!pIGamePlayer)
{
return NULL;
}
else
{
pGamePlayer = (GamePlayer *)malloc(sizeof(GamePlayer));
if(!pGamePlayer)
{
return NULL;
}
memset(pGamePlayer, 0, sizeof(GamePlayer));
strcpy(pGamePlayer->acName, pName);
pGamePlayer->DeleteGamePlayer = DeleteGamePlayer;
pGamePlayer->gmplayer.login = login;
pGamePlayer->gmplayer.killBoss = killBoss;
pGamePlayer->gmplayer.upgrade = upgrade;
pGamePlayer->gmplayer.DeleteIGamePlayer = pGamePlayer->DeleteGamePlayer;
return pGamePlayer;
}
}
/*普通代理的代理者*/
typedef struct _GamePlayerProxy GamePlayerProxy;
struct _GamePlayerProxy
{
IGamePlayer gmplayer; /*继承抽象游戏者*/
GamePlayer *pGamePlayer; /*被代理者*/
void (*DeleteGamePlayerProxy)(GamePlayerProxy *pGamePlayerProxy);
};
void ProxykillBoss(void * pGamePlayerProxy)
{
((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer->gmplayer.killBoss(((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer); /*代理执行被代理者的方法*/
}
void Proxylogin(char *pName, char *pPassword, void *pGamePlayerProxy)
{
((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer->gmplayer.login(pName, pPassword, pGamePlayerProxy);
}
void Proxyupgrade(void *pGamePlayerProxy)
{
((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer->gmplayer.upgrade(((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer);
}
void DeleteGamePlayerProxy(GamePlayerProxy *pGamePlayerProxy)
{
if(pGamePlayerProxy->pGamePlayer)
{
pGamePlayerProxy->pGamePlayer->DeleteGamePlayer(pGamePlayerProxy->pGamePlayer);
}
if(pGamePlayerProxy)
{
free(pGamePlayerProxy);
pGamePlayerProxy = NULL;
}
return;
}
GamePlayerProxy *CreateProxy(char *pName)
{
GamePlayerProxy *pGamePlayerProxy = NULL;
pGamePlayerProxy = (GamePlayerProxy *)malloc(sizeof(GamePlayerProxy));
if(!pGamePlayerProxy)
{
return NULL;
}
memset(pGamePlayerProxy, 0, sizeof(GamePlayerProxy));
pGamePlayerProxy->pGamePlayer = CreateGamePlayer(
(IGamePlayer *)pGamePlayerProxy, pName); /*创建被代理者*/
pGamePlayerProxy->DeleteGamePlayerProxy = DeleteGamePlayerProxy;
pGamePlayerProxy->gmplayer.login = Proxylogin;
pGamePlayerProxy->gmplayer.killBoss = ProxykillBoss;
pGamePlayerProxy->gmplayer.upgrade = Proxyupgrade;
pGamePlayerProxy->gmplayer.DeleteIGamePlayer = pGamePlayerProxy->DeleteGamePlayerProxy;
return pGamePlayerProxy;
}
/*场景*/
void main()
{
/*定义一个代理者*/
IGamePlayer *pPlayProxy = (IGamePlayer *)CreateProxy("zhangsan"); //转换为抽象类, 即场景只依赖于抽象类
/*开始打游戏,记下时间戳*/
printf("game start time is : 2014-1-21 9:00\n");
/*代理登录*/
pPlayProxy->login("zhangsan", "password", pPlayProxy);
/*代理打怪*/
pPlayProxy->killBoss(pPlayProxy);
/*代理升级*/
pPlayProxy->upgrade(pPlayProxy);
/*游戏结束*/
printf("game end time is :2014-1-21 10:00");
/*释放资源*/
pPlayProxy->DeleteIGamePlayer(pPlayProxy);
}
#include <stdlib.h>
#include <string.h>
/*C语言实现<设计模式之禅>之代理模式____普通代理*/
/*代理模式: 为其他对象提供一种代理以控制对这个对象的访问*/
/*普通代理: 调用者只能访问代理角色,而不能访问真实角色。 调用者只知道代理而
不用知道真实角色,屏蔽了真实角色的变更对高层模块的影响。*/
/*抽象游戏者*/
typedef struct _IGamePlayer IGamePlayer;
struct _IGamePlayer
{
void (*login)(char *pName, char *pPassword, void *);
void (*killBoss)(void *);
void (*upgrade)(void *);
void (*DeleteIGamePlayer)(void *);
};
/*游戏者*/
typedef struct _GamePlayer GamePlayer;
struct _GamePlayer
{
IGamePlayer gmplayer; /*继承抽象游戏者*/
char acName[10];
void (*DeleteGamePlayer)(GamePlayer *pGamePlayer);
};
void login(char *pName, char *pPassword, void *pGamePlayer)
{
printf("user :%s is login in !\n", pName);
}
void killBoss(void *pGamePlayer)
{
printf("%s is killing the boss! \n", ((GamePlayer *)pGamePlayer)->acName);
}
void upgrade(void *pGamePlayer)
{
printf("%s is upgrading !\n", ((GamePlayer *)pGamePlayer)->acName);
}
void DeleteGamePlayer(GamePlayer *pGamePlayer)
{
if(pGamePlayer)
{
free(pGamePlayer);
pGamePlayer = NULL;
}
}
GamePlayer *CreateGamePlayer(IGamePlayer *pIGamePlayer, char *pName)
{
GamePlayer *pGamePlayer = NULL;
if(!pIGamePlayer)
{
return NULL;
}
else
{
pGamePlayer = (GamePlayer *)malloc(sizeof(GamePlayer));
if(!pGamePlayer)
{
return NULL;
}
memset(pGamePlayer, 0, sizeof(GamePlayer));
strcpy(pGamePlayer->acName, pName);
pGamePlayer->DeleteGamePlayer = DeleteGamePlayer;
pGamePlayer->gmplayer.login = login;
pGamePlayer->gmplayer.killBoss = killBoss;
pGamePlayer->gmplayer.upgrade = upgrade;
pGamePlayer->gmplayer.DeleteIGamePlayer = pGamePlayer->DeleteGamePlayer;
return pGamePlayer;
}
}
/*普通代理的代理者*/
typedef struct _GamePlayerProxy GamePlayerProxy;
struct _GamePlayerProxy
{
IGamePlayer gmplayer; /*继承抽象游戏者*/
GamePlayer *pGamePlayer; /*被代理者*/
void (*DeleteGamePlayerProxy)(GamePlayerProxy *pGamePlayerProxy);
};
void ProxykillBoss(void * pGamePlayerProxy)
{
((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer->gmplayer.killBoss(((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer); /*代理执行被代理者的方法*/
}
void Proxylogin(char *pName, char *pPassword, void *pGamePlayerProxy)
{
((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer->gmplayer.login(pName, pPassword, pGamePlayerProxy);
}
void Proxyupgrade(void *pGamePlayerProxy)
{
((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer->gmplayer.upgrade(((GamePlayerProxy *)pGamePlayerProxy)->pGamePlayer);
}
void DeleteGamePlayerProxy(GamePlayerProxy *pGamePlayerProxy)
{
if(pGamePlayerProxy->pGamePlayer)
{
pGamePlayerProxy->pGamePlayer->DeleteGamePlayer(pGamePlayerProxy->pGamePlayer);
}
if(pGamePlayerProxy)
{
free(pGamePlayerProxy);
pGamePlayerProxy = NULL;
}
return;
}
GamePlayerProxy *CreateProxy(char *pName)
{
GamePlayerProxy *pGamePlayerProxy = NULL;
pGamePlayerProxy = (GamePlayerProxy *)malloc(sizeof(GamePlayerProxy));
if(!pGamePlayerProxy)
{
return NULL;
}
memset(pGamePlayerProxy, 0, sizeof(GamePlayerProxy));
pGamePlayerProxy->pGamePlayer = CreateGamePlayer(
(IGamePlayer *)pGamePlayerProxy, pName); /*创建被代理者*/
pGamePlayerProxy->DeleteGamePlayerProxy = DeleteGamePlayerProxy;
pGamePlayerProxy->gmplayer.login = Proxylogin;
pGamePlayerProxy->gmplayer.killBoss = ProxykillBoss;
pGamePlayerProxy->gmplayer.upgrade = Proxyupgrade;
pGamePlayerProxy->gmplayer.DeleteIGamePlayer = pGamePlayerProxy->DeleteGamePlayerProxy;
return pGamePlayerProxy;
}
/*场景*/
void main()
{
/*定义一个代理者*/
IGamePlayer *pPlayProxy = (IGamePlayer *)CreateProxy("zhangsan"); //转换为抽象类, 即场景只依赖于抽象类
/*开始打游戏,记下时间戳*/
printf("game start time is : 2014-1-21 9:00\n");
/*代理登录*/
pPlayProxy->login("zhangsan", "password", pPlayProxy);
/*代理打怪*/
pPlayProxy->killBoss(pPlayProxy);
/*代理升级*/
pPlayProxy->upgrade(pPlayProxy);
/*游戏结束*/
printf("game end time is :2014-1-21 10:00");
/*释放资源*/
pPlayProxy->DeleteIGamePlayer(pPlayProxy);
}
0 0
- C语言实现《设计模式之禅》之代理模式——普通代理
- 设计模式之禅——代理模式(一)普通代理&强制代理&虚拟代理&动态代理
- 设计模式之代理模式学习二----普通代理----------《设计模式之禅》学习笔记
- 大白话讲解设计模式之:代理模式 Java语言实现
- 设计模式之——代理模式
- 设计模式之——代理模式
- 设计模式之——代理模式
- 设计模式之— 代理模式
- 设计模式之——代理模式(静态代理)
- 设计模式之——代理模式(动态代理)
- 设计模式之代理模式(C++)
- 《设计模式之禅》样章连载6:代理模式扩展之“普通代理”和“强制代理”
- [转]《设计模式之禅》样章连载6:代理模式扩展之“普通代理”和“强制代理”
- 系统架构设计——设计模式之代理模式(二)CGLIB动态代理实现
- 设计模式之代理模式,C++实现
- scala实现设计模式之代理模式
- 设计模式之禅——代理模式(二)代理模式&AOP编程&JDK对代理模式的支持
- 设计模式之代理
- <!DOCTYPE> 标签的深度剖析以及使用选择
- EditURL与NavigateURL
- Cadence 信号完整性(二)-- 电源完整性理论基础1
- PMP备考
- 敏捷开发一千零一问系列之三十八:计划扑克就是打不出个结果怎么办?
- C语言实现《设计模式之禅》之代理模式——普通代理
- Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space
- OpenGL学习十四:光照1
- ESXI 5.5的搭建以及VMware9.0的虚拟机移植
- Handler整理
- 谁动了我的cpu——oprofile使用札记
- IE9 table显示问题,td出现错位的解决方法
- C++ 智能指针
- ASP.NET中的URL编码解码