代理模式(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;
- }