设计模式(5)-己所不欲,施之于人(代理模式)

简介:

什么是代理?在我们的日常生活中的例子非常多。

比如上网有的时候使用代理服务器,通过代理上网,这就是代理的一个非常常见的例子。

从这里边可以看到3个对象:真实网路对象,代理对象还有客户端对象。

真实对象和代理对象还都有访问网络的方法所以抽象出网络对象。

对应的类图关系如下:

2011041613283476.jpg

如图:

真实的网络被隐藏起来,我们访问的是代理的网络对象,同时我们可以在访问代理对象的同时动态的加上比如验证用户,清除用户信息的方法。

生成的文件如下:

client.h


class Client
{
 
public:
 Client();
 virtual ~Client();
 
};

client.cpp

#include "Client.h"
#include "Network.h"
#include "ProxyNetwork.h"
 
Client::Client(){
 
}
 
Client::~Client(){
 
}
 
int main(){
 ProxyNetwork* proxyNetwork = new ProxyNetwork();
 proxyNetwork->browse();
 return 0;
}

Network.h

#include <iostream>
 
using namespace std;
 
class Network
{
 
public:
 Network();
 virtual ~Network();
 
 virtual void browse() = 0;
 
};

Network.cpp

#include "Network.h"
 
 
Network::Network(){
 
}
 
Network::~Network(){
 
}

ProxyNetwork.h

#include "RealNetwork.h"
#include "Network.h"
 
class ProxyNetwork : public Network
{
 
public:
 ProxyNetwork();
 virtual ~ProxyNetwork();
 RealNetwork* realNetwork;
 
 virtual void browse();
 
private:
 void checkUser();
 void clearUserinfo();
 
};

ProxyNetwork.cpp

#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; 
}

RealNetwork.h

#include "Network.h"
 
class RealNetwork : public Network
{
 
public:
 RealNetwork();
 virtual ~RealNetwork();
 
 virtual void browse();
 
};

RealNetwork.cpp

#include "RealNetwork.h"
 
 
RealNetwork::RealNetwork(){
 
}
 
RealNetwork::~RealNetwork(){
 
}
 
void RealNetwork::browse(){
 cout<<"访问真实网路..."<<endl;
}

运行client.cpp中的main,我们得到如下:

2011041613374344.jpg

代理模式:为其它对象提供一种代理以控制对这个对象的访问。

代理模式的几种应用场景:

1,远程代理,为一个对象在不同的空间提供局部代表,隐藏真实对象,webservice的调用就是一个最好的例子。

2,虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。浏览网页时,我们访问缓存中的对象就是其中一个例子。

3,安全代理,控制真实对象的访问权限,不让外部看到真实的网络情况。上边的例子就是一个比较好的实例。

目录
相关文章
|
3月前
|
设计模式
设计模式-代理模式
设计模式-代理模式
|
1月前
|
设计模式 JavaScript Java
设计模式——代理模式
一文讲清楚设计模式中的代理模式
21 0
设计模式——代理模式
|
1月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
1月前
|
设计模式 uml
设计模式之代理模式
设计模式之代理模式
|
1月前
|
设计模式 Arthas Java
【设计模式】代理模式
【设计模式】代理模式
|
2月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
55 1
|
3月前
|
设计模式 Dubbo Java
设计模式-代理模式
设计模式-代理模式
31 0
|
3月前
|
设计模式 缓存 安全
聊聊Java设计模式-代理模式
代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
62 1
|
3月前
|
设计模式
设计模式 | 代理模式
设计模式 | 代理模式
13 0
|
3月前
|
设计模式 Go 网络安全
Golang设计模式——21代理模式
Golang设计模式——21代理模式
23 0