结构型模式之代理模式(Proxy)

来源:互联网 发布:windows phone app 编辑:程序博客网 时间:2024/06/07 00:43
1. 意图
为其他对象提供一种代理以控制对这个对象的访问。

2. 动机

因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一个替身。即代理对象。它可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

例子1:经典例子就是网络代理,你想访问facebook或者twitter ,如何绕过GFW,找个代理网站。

例子2:可以调用远程代理处理一些操作如图:


3.分类


在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用 Proxy模式。下面是一些可以使用Proxy模式常见情况:

1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 
3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

4.C++举例

#ifndef PROXY_H#define PROXY_H#include <iostream>#include <string>using std::string;using std::cout;using std::endl;class CImage{public:virtual void Display()=0;};class CRealImage : public CImage{private:string m_ImageName;public:CRealImage(){}CRealImage(string temp){m_ImageName=temp;LoadImage();}virtual void  Display(){cout<<"Displaying "<<m_ImageName<<endl;}void LoadImage(){cout<<"Loading "<<m_ImageName<<endl;}};class CProxyImage : public CImage{private:string m_ImageName;CRealImage* m_Image;public:CProxyImage(){}CProxyImage(string temp) : m_ImageName(temp),m_Image(NULL){}virtual void Display(){if(m_Image==NULL){m_Image=new CRealImage(m_ImageName);}m_Image->Display();}};#endif#include <iostream>#include "Proxy.h"int main(){CProxyImage proxy("beauty.jpg");//只有图片名称,没有创建实例。proxy.Display();//在使用时创建图片实例并加载,然后显示。proxy.Display();//由于已经创建,因此只需显示即可。return 0;}




1 0