意图:为其他对象提供一种代理以控制对这个对象的访问。
适用性:在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理模式,下面是几种常见情况
(1)远程代理(Remote Proxy):为一个对象在不同的地址空间提供局部代表。
(2)虚代理(Virtual Proxy):根据需要创建开销很大的对象。
(3)保护代理(Protection Proxy):控制对原始对象的访问,保护代理用于对象应该有不同的访问权限的时候。
(4)智能代理(Smart Reference):取代简单的指针,在访问对象时执行一些附加的操作。它的典型用途包括:
- 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。
- 当第一次引用一个持久对象时,将它装入内存。
- 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
代理模式的C++实现
proxy.h
#ifndef _PROXY_H_
#define _PROXY_H_
class subject
{
public:
subject(){}
virtual ~subject(){}
virtual void Request() = 0;
};
class realsubject :public subject
{
public:
realsubject();
virtual ~realsubject();
virtual void Request();
};
class proxy :public subject
{
public:
proxy();
virtual ~proxy();
virtual void Request();
private:
<span style="color:#FF0000;">realsubject* pRealsubject;</span>
};
#endif
proxy.cpp
#include <iostream>
#include "proxy.h"
using namespace std;
realsubject::realsubject()
{
cout<<"constructing a realsubject"<<endl;
}
realsubject::~realsubject()
{
cout<<"distory the realsubject"<<endl;
}
void realsubject::Request()
{
cout<<"request by realsubject"<<endl;
}
proxy::proxy()
{
pRealsubject = NULL;
cout<<"constructing a proxy"<<endl;
}
proxy::~proxy()
{
delete pRealsubject;
pRealsubject = NULL;
cout<<"distory the proxy"<<endl;
}
void proxy::Request()
{
if(NULL == pRealsubject)
{
cout<<"request by proxy"<<endl;
pRealsubject = new realsubject();
}
pRealsubject->Request();
}
main.cpp
void main()
{
subject *pProxy = new proxy();
pProxy->Request();
delete pProxy;
pProxy = NULL;
}