Proxy(代理模式)

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;
}

 

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值