代理模式
定义:
为其他对象提供一种代理以控制这个对象的访问。
适用性:
在需要比较通用和复杂的对象指针代替简单的指针的时候,需要使用代理模式。以下是几种常见的情况:
1、 远程代理,为一个对象在不同的地址空间提供局部代表。
2、 虚代理,根据需要创建开销很大的对象。
3、 保护代理,控制对原对象的访问。
4、 智能指引,取代简单的指针,在访问对象时执行一些附加操作。
结构:
实现:
class Subject
{
public:
virtual void Request() {};
virtual~Subject(){}
};
//真实角色类
class RealSubject:public Subject
{
public:
voidRequest()
{
cout<<"RealSubject Request"<<endl;
}
};
//代理类
class Proxy:public Subject
{
public:
Proxy(Subject *pobject):m_pSubject(pobject)
{ }
voidRequest()
{
before();
m_pSubject->Request();
after();
}
protected:
//在调用真实角色之前的一些控制操作
voidbefore()
{
cout<<"before Proxy call RealSubject Request"<<endl;
}
//在调用真实角色之后的一些控制操作
voidafter()
{
cout<<"after Proxy call RealSubject Request"<<endl;
}
private:
Subject *m_pSubject;
};
Subject *pobject = new RealSubject;
Proxy *px = newProxy(pobject);
px->Request();
扩展:
普通代理,有时候用户不能直接访问真实角色,只能访问代理。就是我们不能直接new一个RealSubject对象,然后传给代理。这时候我们需要改代理,让代理自动生成一个真实角色对象。
class Proxy:public Subject
{
public:
Proxy()
{
m_pSubject = new RealSubject;
}
voidRequest()
{
before();
m_pSubject->Request();
after();
}
protected:
voidbefore()
{
cout<<"before Proxy call RealSubject Request"<<endl;
}
voidafter()
{
cout<<"after Proxy call RealSubject Request"<<endl;
}
private:
Subject *m_pSubject;
};
相关模式比较:
1、 适配器模式,适配器模式为它所适配的对象提供了一个不同的接口。而代理提供的接口与它的实体的接口相同
2、 装饰模式:代理模式与装饰模式的实现类似。但装饰模式的目的是为对象添加功能,而代理则控制对对象的访问。