代理模式:爲其他對象提供一種代理以控制對這個對象的訪問
關鍵在於控制
如下面的例子;一個人想要找周杰倫簽名或者拍電源或者拍廣告必須先經過經紀人而不能直接找周杰倫,而經紀人可以在中間控制一下,比如驗證這個人的身份,滿足要求才讓你見到周杰倫
需要的知識:函數指針,結構體指針高級用法向上強轉和向下強轉(可以看我的另外一篇文章)
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");
}
//周杰倫的實際處理
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");
}
else{
p->zhoujielun.sign(v);
}
}
//經紀的實際處理
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/