上篇我们讲了组合模式,这篇咱们来聊聊代理模式,代理模式的应用场景很多,代理模式的本质就是将原对象隐藏起来,构造一个和原对象相同父类的代理对象,对外的功能接口也和原对象保持一致,外部程序只需要调用代理对象的接口即可,然后具体实现再由代理对象去调用原对象接口。这样就完全将原对象隐藏和保护起来了,当然,代理对象还可以针对不同权限的外部程序提供对原对象不同的访问权限。
代理模式:
以下代码在VS2012上编译通过,
.h文件
class Subject//抽象基类
{
public :
virtual void Domethod();
};
class Realsubject: public Subject//原对象类
{
public :
void Domethod();
};
class ProxSubject: public Subject//代理对象类
{
Realsubject* pRS;
public:
void PreDomethod();
void Domethod();
};
.cpp文件
void Subject::Domethod()
{
}
void Realsubject::Domethod()
{
std::cout << "This is method in Realsubject"<<std::endl;
}
void ProxSubject::PreDomethod()
{
pRS=new Realsubject();
}
void ProxSubject::Domethod()
{
std::cout << "This is method in ProxSubject"<<std::endl;
pRS->Domethod();
}
调用代码:
int main(int argc, const char * argv[]) {
//一般调用方式
Realsubject* pR=new Realsubject();
pR->Domethod();
//代理模式下的调用方式
ProxSubject* pPr=new ProxSubject();
pPr->PreDomethod();
pPr->Domethod();
return 0;
}
输出:
This is method in Realsubject
This is method in ProxSubject
This is method in Realsubject
其实横向比较,代理模式和外观模式有点类似,不同的是代理模式对外提供的接口和原类提供的接口一样,因此代理模式对外提供的接口和原对象提供的接口是一对一的。而外观模式是一个外部接口调用多个内部子系统接口,而且接口名称和功能不一定一样。