代理模式有俩个英文名字:Proxy Pattern SurrogatePattern
定义:为期货对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或
者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户
不能看到的内容和服务或者增添客户需要的额外服务。
JAVA与模式中将代理模式分为8种:常见的有1.远程代理(remote);2.虚拟代理(virtual);3.保护代理(Protect or Access);
4.智能引用(Smart Reference)代理等。
结构:
1.抽象主题角色:声明了真实主题和代理主题的共同接口。
2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相贩接口。
3.真实主题角色:定义真实的对象
class Subject
{
public:
Subject(){}
virtual ~Subject(){}
virtual void Request() = 0;
};
// 真正使用的实体
class RealSubject
: public Subject
{
public:
RealSubject();
virtual ~RealSubject(){}
virtual void Request()
{
std::cout << "Request By RealSubject\n";
}
};
// 代理类,含有一个指向RealSubject对象的指针
class Proxy
: public Subject
{
public:
Proxy()
: m_pRealSubject(NULL)
{
std::cout << "Constructing a Proxy\n";
}
virtual ~Proxy()
{
delete m_pRealSubject;
m_pRealSubject = NULL;
}
virtual void Request()
{
// 需要使用RealSubject的时候才去初始化
if (NULL == m_pRealSubject)
{
std::cout << "Request By Proxy\n";
m_pRealSubject = new RealSubject();
}
m_pRealSubject->Request();
}
private:
RealSubject* m_pRealSubject;
};
int main()
{
Subject* pProxy = new Proxy();
pProxy->Request();
delete pProxy;
return 0;
}
五、总结
代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。代理模式
中的真实主题角色可以结合组合模式来构造,这样一个代理主题角色就可以对一系列的真实
主题角色有效,提高代码利用率,减少不必要子类的产生。