读《大话设计模式》-代理模式(proxy)
 

2009-09-28 作者:jia_xiaoxin 来源:jia_xiaoxin的blog

 

代理模式(proxy)

为其他对象提供一个代理以控制对这个对象的访问。

结构图

//Subject类,定义了RealSubjext和Proxy的公共接口,这样就在任何使用RealSubject的地方可以使用Proxy
class Subject
{
public:
virtual void Request() = 0;
};
//RealSubject类,定义Proxy所代表的真实实体
class RealSubject: public Subject
{
public:
virtual void Request()
{
cout << "真实的请求" << endl;
}
};
//Proxy类,保存一个引用使得代理可以访问实体
class Proxy : public Subject
{
private:
RealSubject * realSubject;
public:
virtual void Request()
{
if(realSubject == NULL)
{
realSubject = new RealSubject;
}
realSubject->Request();
}
};

int main(int argc, char* argv[])
{
Proxy * proxy = new Proxy();
proxy->Request();
return 0;
}

代理模式的应用:

  • 远程代理,也就是为一个对象在不同的地址空间提供局部代理。这样可以隐藏一个对象存在于不同地址空间的事实

WebServer在.net中的应用就是这样的一个例子

  • 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真对象。

这样可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,文字很快就出来了,但是图片却是一张一张下载后才能看到,那些未打开的图片框,就是通过虚拟代理替换了真实的图片。

  • 安全代理,用来控制真实对象访问时的权限。
  • 智能指引,是指当调用真实的对象时,代理处理另外一些事。

下面举个实例:

秀才让小六代其求婚

#include <iostream>
#include <string>
using namespace std;

// BeautifulGirl类
class BeautifulGirl
{
public:
string Name;
};

//代理接口
class PursueMM
{
virtual void Giveflower() = 0;
virtual void InviteDinning() = 0;
virtual void Shopping() = 0;
};

//追求者类
class Pursuit : public PursueMM
{
private:
string name;
BeautifulGirl * mm;
public:
Pursuit(BeautifulGirl * _mm = NULL) : mm(_mm){}
void Giveflower()
{
cout << "送" << mm->Name + "鲜花" << endl;
}
void InviteDinning()
{
cout << "请" << mm->Name + "吃饭" << endl;
}
void Shopping()
{
cout << "带" << mm->Name + "逛商场" << endl;
}
};

//代理类如下
class Proxy : public PursueMM
{
private:
Pursuit * gg;
public:
Proxy(BeautifulGirl * mm = NULL)
{
gg = new Pursuit(mm);
}
void Giveflower()
{
cout << "小六";
gg->Giveflower();
}
void InviteDinning()
{
cout << "小六";
gg->InviteDinning();
}
void Shopping()
{
cout << "小六";
gg->Shopping();
}

};

int main()
{
BeautifulGirl * Guofurong = new BeautifulGirl;
Guofurong->Name = "郭芙蓉";
Proxy * xiaoliu = new Proxy(Guofurong);
xiaoliu->Giveflower();
xiaoliu->InviteDinning();
xiaoliu->Shopping();

return 0;
}

火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织