代理模式:
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
RealSubject类,定义Proxy所代表的真实实体。
Proxy类,保存一个引用使用代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以代替实体。
代理模式代码:
#include<iostream>
usingnamespace std;
classSubject
{
public:
virtual void Request()=0;
};
classRealSubject:virtual public Subject
{
public:
void Request()
{
cout<<"真实实体请求!"<<endl;
}
};
classProxy:virtual public Subject
{
public:
Proxy():realsubject(NULL){}
void Request()
{
if(realsubject==NULL)
{
realsubject=newRealSubject();
}
realsubject->Request();
}
~Proxy()
{
if(realsubject!=NULL)
delete realsubject;
}
private:
RealSubject *realsubject;
};
intmain()
{
Proxy *pProxy=new Proxy();
pProxy->Request();
delete pProxy;
return 0;
}
代理模式的应用:
1) 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2) 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
3) 安全代理:用来控制真实对象访问时的权限。
实例代码:
#include<iostream>
#include<string>
usingnamespace std;
classSend
{
public:
virtual void Request()=0;
};
classSender:virtual public Send //寄信人类(实体类)
{
public:
Sender():name(NULL),address(NULL){}
Sender(string name,stringaddress):name(name),address(address){}
void Request()
{
cout<<"此信件寄往:"<<address<<"—"<<"收件人:"<<name<<endl;
}
private:
string name;
string address;
};
classSendProxy:virtual public Send //快递公司(代理类)
{
public:
SendProxy():pSender(NULL){}
void Request()
{
cout<<"欢迎使用申通快递!"<<endl;
if(pSender==NULL)
{
string name,address;
cout<<"请输入您要寄往的地址和收件人姓名:"<<endl;
cin>>address>>name;
pSender=newSender(name,address);
}
pSender->Request();
cout<<"很高兴为您服务! 即将为您派送"<<endl;
}
~SendProxy()
{
if(pSender!=NULL)
delete pSender;
}
private:
Sender * pSender;
};
intmain()
{
SendProxy *pSendProxy=new SendProxy();
pSendProxy->Request();
delete pSendProxy;
return 0;
}