1、作用
为其他对象提供一种代理以控制对这个对象的访问。 简单的说,就是客户端和目标端之间的中介。
举个例子:
房东出租房子,但懒得自己找租客,因此找了中介,由中介代理租房,租客租房子,直接找不到房东,通过中介找房东租房子,这个中介可以看作是代理。
优点:
- 通过一个代理对象完成一系列的操作处理,在以后的改动中,就会允许操作对象(动态修改、添加等),符合开放封闭原则
- 代理模式协调了调用者和被调用者,降低了代码的耦合度, 扩转性较好
- 可以以小对象代理大对象,减少消耗(虚拟代理)
代理场景:
- 远程代理:也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,(比如打开一个图像处理对象)。
- 安全代理:用来控制真实对象访问的权限。
- 智能指针:取代了简单的指针,它在访问对象时执行一些附加操作。
角色:
Subject: 定义了真正调用的对象和代理的公有接口,这样就可以在使用realSubject 的任何地方都能使用Proxy。
Proxy: 控制对象的实体,可以创建和删除,被代理的对象直到真正使用的时候才会被创建初始化,没有使用到的时候用一个Proxy作一个占位符。
RealSubject: 被代理类
UML 结构图:
例子:
#include<iostream>
using namespace std;
//定义了 Proxy 和 Landlord 的公有接口,
//这样就可以在任何需要使用到Landlord的地方都使用Proxy
class Subject
{
public:
Subject(){}
virtual ~Subject(){}
virtual void rentHouse() = 0;
};
//真正使用的实体,被代理类
class Landlord:public Subject
{
public:
Landlord()
{
cout << "construction Landlord" << endl;
}
virtual ~Landlord(){}
virtual void rentHouse()
{
cout << "The landlord rents out the house." << endl;
}
};
//代理类,含有一个指向Landlord对象的指针,房屋中介
class Proxy:public Subject
{
public:
Proxy() : m_pLandlord(NULL)
{
cout << "construction a Proxy" << endl;
}
virtual ~Proxy()
{
delete m_pLandlord;
m_pLandlord = NULL;
}
virtual void rentHouse()
{
//需要使用Landlord的时候才去初始化
if(NULL == m_pLandlord)
{
cout << "Realquest by Proxy" << endl;
m_pLandlord = new Landlord();
}
m_pLandlord->rentHouse();
}
private:
Landlord* m_pLandlord;
};
class Renter
{
public:
Renter() : m_pProxy(NULL)
{
}
virtual ~Renter()
{
delete m_pProxy;
m_pProxy = NULL;
}
void findHouse()
{
cout << "A tenant rents a house by proxy." << endl;
if(m_pProxy == NULL)
{
m_pProxy = new Proxy();
}
m_pProxy->rentHouse();
}
private:
Proxy* m_pProxy;
};
int main()
{
Renter* pRenter = new Renter();
pRenter->findHouse();
delete pRenter;
pRenter = NULL;
return 0;
}