1、定义:
为其他对象提供一种代理以控制对这个对象的访问。
2、结构:
3、协作角色
proxy
(1)保存一个引用使得代理可以访问一个实体。
(2)提供一个与subject相同的接口,使得代理可以代替实体。
(3) 控制对实体的访问
Subject
定义与RealSubject 和 Proxy 公用的接口。
RealSubject
定义proxy所代理的实体。
4、适用性:
1、远程代理,为一个对象在不同的地址空间提供局部代表。
2、虚拟代理,在需要的时候再去创建开销很大的对象。
3、保护代理,控制对原始对象的访问,这种可以用于对象应该有不同的访问权限。
4、智能指针,对访问对象提供一些操作,如在没有引用时释放,第一次访问是装入内存,锁定对象等等。
5、实例:
1、硬件代理,
(1)需求,在系统中如果每个用户都直接访问硬件设备,如果硬件状态发生变化,必然会导致各种问题。而且,改变硬件,每个用户都要去改变
(2)解决,为用户提供硬件的代理,对硬件进行封装,在内部处理硬件状态的变化等,对用户提供一致的接口,这样可以是用户便于维护。
(3)结构图,
(4)实现代码
hw_proxy.h
#ifndef __HW_PROXY_H__
#define __HW_PROXY_H__
#define HW_SUCCESS 0
#define HW_FAILED (-1)
typedef enum {
HW_INIT,
HW_OPEN,
HW_ENABLE,
HW_DIABLE,
HW_CLOSE,
}HW_STATE;
typedef struct {
HW_STATE state;
void *private;
}hw_data;
hw_data *hw_init(void);
int hw_open(hw_data *hw);
int hw_close(hw_data *hw);
int hw_enable(hw_data *hw);
int hw_diable(hw_data *hw);
#endif
hw_proxy.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "hw_proxy.h"
hw_data *hardware = NULL;
hw_data *hw_init(void)
{
if(hardware != NULL)
{
hardware->state = HW_INIT;
return hardware;
}
hardware = (hw_data *)malloc(sizeof(hw_data));
if(hardware == NULL)
{
return NULL;
}
memset((void *)hardware, 0, sizeof(hw_data));
hardware->state = HW_INIT;
printf("%s state, %d\n",__func__,hardware->state);
return hardware;
}
int hw_open(hw_data *hw)
{
int ret = HW_FAILED;
if(hw == NULL)
{
return ret;
}
hw->state = HW_OPEN;
hw->private = (void *)hw;
ret = HW_SUCCESS;
printf("%s state, %d\n",__func__,hw->state);
return ret;
}
int hw_close(hw_data *hw)
{
int ret = HW_FAILED;
if((hw == NULL) || (hw->state == HW_CLOSE))
{
return ret;
}
hw->state = HW_CLOSE;
ret = HW_SUCCESS;
printf("%s state, %d\n",__func__,hw->state);
return ret;
}
int hw_enable(hw_data *hw)
{
int ret = HW_FAILED;
if((hw == NULL) || (hw->state == HW_CLOSE))
{
return ret;
}
hw->state = HW_ENABLE;
ret = HW_SUCCESS;
printf("%s state, %d\n",__func__,hw->state);
return ret;
}
int hw_diable(hw_data *hw)
{
int ret = HW_FAILED;
if((hw == NULL) || (hw->state == HW_CLOSE))
{
return ret;
}
hw->state = HW_DIABLE;
ret = HW_SUCCESS;
printf("%s state, %d\n",__func__,hw->state);
return ret;
}
client.c
#include <stdio.h>
#include "hw_proxy.h"
int main()
{
int ret;
hw_data *hw = NULL;
hw = hw_init();
if(hw == NULL)
return -1;
ret = hw_open(hw);
if(ret != HW_SUCCESS)
return ret;
ret = hw_enable(hw);
if(ret != HW_SUCCESS)
return ret;
ret = hw_diable(hw);
if(ret != HW_SUCCESS)
return ret;
ret = hw_close(hw);
if(ret != HW_SUCCESS)
return ret;
return 0;
}