代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
Subject类,被代理的类。定义了RealSubject和Proxy的接口。这样代理类就可以执行被代理的所有行为。RealSubject定义Proxy所代理的真实实体。Proxy类,代理类,与RealSubject有相同的接口。
#include<iostream>
using namespace std;
class Subject
{
public:
Subject()
{
}
virtual void function1()=0;
virtual void function2()=0;
virtual void function3()=0;
};
class RealSubject:public Subject
{
public:
virtual void function1()
{
//function1的功能
std::cout<<"ReadSubject function1"<<endl;
}
virtual void function2()
{
//function2的功能
std::cout<<"ReadSubject function2"<<endl;
}
virtual void function3()
{
//function3的功能
std::cout<<"ReadSubject function3"<<endl;
}
};
class Proxy:public Subject
{
public:
RealSubject *rs;
public:
Proxy()
{
rs=new RealSubject;
}
virtual void function1()
{
rs->function1();
}
virtual void function2()
{
rs->function2();
}
virtual void function3()
{
rs->function3();
}
} ;
int main(int argc,char**argv)
{
Proxy proxy;
proxy.function1();
proxy.function2();
proxy.function3();
return 0;
}
通俗的说就是在访问对象时引入一定程度的间接性,正是有了这种间接,可以附加多种用途。
一般有以下几种应用:
一:远程代理,也就是为对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。
二:虚拟代理,根据需要创建开销很大的对象,通过它来存在实例化时间很长的真实对象。
三:安全代理,控制真是访问对象的权限。
四:智能指引,是指当调用真实对象时,代理处理另外一些事情。
现在看来代理模式也并不是多么新奇。很早之前就有接触,以前刚学习C++的时候接触过,《C++大学教程》里有介绍。记得当时是为了隐藏类的成员变量,因为当类创建好后,虽然类的实现可以以dll的形式提供,但是类的头文件还是必须提供给客户的,这就造成某些信息的泄漏。如成员变量。引入了代理后,仅仅只需要将代理的头文件暴露给客户,实现了隐藏被代理类的目的。