代理模式:为其他对象提供一种代理以控制对这个对象的访问
关键在于控制
如下面的例子;一个人想要找周杰伦签名或者拍电源或者拍广告必须先经过经纪人而不能直接找周杰伦,而经纪人可以在中间控制一下,比如验证这个人的身份,满足要求才让你见到周杰伦
需要的知识:函数指针,结构体指针高级用法向上强转和向下强转(可以看我的另外一篇文章)
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
//定义接口
typedef struct{
//签名
char* (*sign)(void*);
//拍电影
void (*MakeFilm)(void*);
//拍广告
void (*MakeCommercials)(void*);
}BehaviourInterface_t;
//周杰伦的实际处理
static char* zhoujielunsign(void* v)
{
printf("sign ok...\n");
return (char*)"Hello";
}
//周杰伦的实际处理
static void zhoujielunMakeFilm(void* v)
{
printf("MakeFilm ok...\n");
}
//周杰伦的实际处理
static void zhoujielunMakeCommercials(void* v)
{
printf("MakeCommercials ok...\n");
}
//实例创建
typedef struct{
//代理对象相当于经纪人
BehaviourInterface_t Proxy;
//实际的对象周杰伦
BehaviourInterface_t zhoujielun;
//控制对象的变量
int age;
int sex;
char CompanyName[32];
}BehaviourProxyNew_t;
//经纪的实际处理
static char* Proxysign(void* v)
{
BehaviourProxyNew_t* p = (BehaviourProxyNew_t*)v;
//如果小于18岁或者是男的话就不给你签名,经纪人在这里控制了一下
if(p->age < 18 || p->sex ==1){
printf("You are too young or you are man,no sign thank you...\n");
return (char*)"You are too young or you are man,no sign thank you";
}
else{
return p->zhoujielun.sign(v);
}
return NULL;
}
//经纪的实际处理
static void ProxyMakeFilm(void* v)
{
BehaviourProxyNew_t* p = (BehaviourProxyNew_t*)v;
//如果是小公司的话就不拍,我的艺人就是这么豪横,经纪人在这里控制了一下
if(strcmp(p->CompanyName,"small")==0){
printf("sorry you company is so small...\n");
}
else if(strcmp(p->CompanyName,"big")==0){
p->zhoujielun.MakeFilm(v);
}
}
//经纪的实际处理
static void ProxyCommercials(void* v)
{
BehaviourProxyNew_t* p = (BehaviourProxyNew_t*)v;
//如果是小公司的话就不怕,我的艺人就是这么豪横,经纪人在这里控制了一下
if(strcmp(p->CompanyName,"small")==0){
printf("sorry you company is so small...\n");
}
else if(strcmp(p->CompanyName,"big")==0){
p->zhoujielun.MakeCommercials(v);
}
}
//代理创建
static BehaviourProxyNew_t* NewProxy(int age,int sex,const char* CompanyName)
{
BehaviourProxyNew_t *p = (BehaviourProxyNew_t*)malloc(sizeof(BehaviourProxyNew_t));
//经纪人实现接口 相当于代理对象
p->Proxy.sign = Proxysign;
p->Proxy.MakeFilm = ProxyMakeFilm;
p->Proxy.MakeCommercials = ProxyCommercials;
//周杰伦实现接口 相对于实际对象
p->zhoujielun.sign = zhoujielunsign;
p->zhoujielun.MakeFilm = zhoujielunMakeFilm;
p->zhoujielun.MakeCommercials = zhoujielunMakeCommercials;
//经纪人独有的控制变量
p->age = age;
p->sex = sex;
memcpy(p->CompanyName,CompanyName,strlen(CompanyName));
return p;
}
int main(void)
{
//第一个代理处理名为hansen的人 男性 27岁 大公司的人
BehaviourInterface_t *HansenProxy = (BehaviourInterface_t*)NewProxy(27,1,"big");//1:male
//第二个人名为Maria的人,女性 22岁,小公司的人
BehaviourInterface_t *MariaProxy = (BehaviourInterface_t*)NewProxy(22,0,"small");//0:female
printf("hansenProxy----------------------------------------------\n");
HansenProxy->sign(HansenProxy);
HansenProxy->MakeFilm(HansenProxy);
HansenProxy->MakeCommercials(HansenProxy);
printf("\n\nMariaProxy-----------------------------------------------\n");
MariaProxy->sign(MariaProxy);
MariaProxy->MakeFilm(MariaProxy);
MariaProxy->MakeCommercials(MariaProxy);
}
//C语言在线测试网站
//http://www.dooccn.com/c/