23种软件设计模式之代理模式,C语言实现(举一个明星代理例子)

代理模式:为其他对象提供一种代理以控制对这个对象的访问
关键在于控制
如下面的例子;一个人想要找周杰伦签名或者拍电源或者拍广告必须先经过经纪人而不能直接找周杰伦,而经纪人可以在中间控制一下,比如验证这个人的身份,满足要求才让你见到周杰伦
需要的知识:函数指针,结构体指针高级用法向上强转和向下强转(可以看我的另外一篇文章)

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/

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值