skyme 2016-04-25 888浏览量
什么是代理?在我们的日常生活中的例子非常多。
比如上网有的时候使用代理服务器,通过代理上网,这就是代理的一个非常常见的例子。
从这里边可以看到3个对象:真实网路对象,代理对象还有客户端对象。
真实对象和代理对象还都有访问网络的方法所以抽象出网络对象。
对应的类图关系如下:
如图:
真实的网络被隐藏起来,我们访问的是代理的网络对象,同时我们可以在访问代理对象的同时动态的加上比如验证用户,清除用户信息的方法。
生成的文件如下:
client.h
class Client
{
public:
Client();
virtual ~Client();
};
#include "Client.h"
#include "Network.h"
#include "ProxyNetwork.h"
Client::Client(){
}
Client::~Client(){
}
int main(){
ProxyNetwork* proxyNetwork = new ProxyNetwork();
proxyNetwork->browse();
return 0;
}
#include <iostream>
using namespace std;
class Network
{
public:
Network();
virtual ~Network();
virtual void browse() = 0;
};
#include "Network.h"
Network::Network(){
}
Network::~Network(){
}
#include "RealNetwork.h"
#include "Network.h"
class ProxyNetwork : public Network
{
public:
ProxyNetwork();
virtual ~ProxyNetwork();
RealNetwork* realNetwork;
virtual void browse();
private:
void checkUser();
void clearUserinfo();
};
#include "ProxyNetwork.h"
ProxyNetwork::ProxyNetwork(){
}
ProxyNetwork::~ProxyNetwork(){
}
void ProxyNetwork::browse(){
ProxyNetwork::checkUser();
realNetwork = new RealNetwork();
realNetwork->browse();
ProxyNetwork::clearUserinfo();
}
void ProxyNetwork::checkUser(){
cout<<"调用真实对象之前检验用户名"<<endl;
}
void ProxyNetwork::clearUserinfo(){
cout<<"调用真实对象之后清除用户信息"<<endl;
}
#include "Network.h"
class RealNetwork : public Network
{
public:
RealNetwork();
virtual ~RealNetwork();
virtual void browse();
};
#include "RealNetwork.h"
RealNetwork::RealNetwork(){
}
RealNetwork::~RealNetwork(){
}
void RealNetwork::browse(){
cout<<"访问真实网路..."<<endl;
}
运行client.cpp中的main,我们得到如下:
代理模式:为其它对象提供一种代理以控制对这个对象的访问。
代理模式的几种应用场景:
1,远程代理,为一个对象在不同的空间提供局部代表,隐藏真实对象,webservice的调用就是一个最好的例子。
2,虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。浏览网页时,我们访问缓存中的对象就是其中一个例子。
3,安全代理,控制真实对象的访问权限,不让外部看到真实的网络情况。上边的例子就是一个比较好的实例。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。