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

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

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

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

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

 对应的类图关系如下:

如图:

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

生成的文件如下:

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,我们得到如下:

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维前线

使用MySQL community 源安装MySQL

使用MySQL community 源安装MySQL 添加MySQL Yum源 下载:http://dev.mysql.com/downloads/repo/y...

33470
来自专栏DeveWork

Gravatar开发者手册

Gravatar上所有URL都是基于电子邮箱地址的哈希值。图像和个人档都是通过电子邮件的哈希值访问获取的,这是系统识别用户身份的主要方式。为确保哈希值的一致性和...

32950
来自专栏DeveWork

Gravatar开发者手册

Gravatar上所有URL都是基于电子邮箱地址的哈希值。图像和个人档都是通过电子邮件的哈希值访问获取的,这是系统识别用户身份的主要方式。为确保哈希值的一致性和...

267100
来自专栏智能计算时代

Envoy架构概览(5):负载均衡

负载均衡 当过滤器需要获取到上游群集中主机的连接时,群集管理器使用负载平衡策略来确定选择哪个主机。 负载平衡策略是可插入的,并且在配置中以每个上游集群为基础进行...

45270
来自专栏进击的程序猿

raft 系列解读(4) 之 etcd-raft学习

大多数Raft的实现都是整体设计,包括存储处理,消息序列化和网络传输,但是本raft库在实现的时候只实现了最核心的算法,换来了灵活性和性能,网络和disk IO...

15440
来自专栏贾老师の博客

【笔记】高性能服务器设计

14340
来自专栏北京马哥教育

用Linux命令行生成随机密码的十种方法

Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它。例如,你可以通过数十种方法来生成随机密码。本文将介绍生成随机密码的十种方法。 ...

37660
来自专栏linux驱动个人学习

Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择...

20820
来自专栏Seebug漏洞平台

CVE-2015-1641 Word 利用样本分析

00 引 子 本文我们将通过一个恶意文档的分析来理解漏洞 CVE-2015-1641(MS15-033)的具体利用过程,以此还原它在现实攻击中的应用。就目前来...

37180
来自专栏tkokof 的技术,小趣及杂念

Sweet Snippet系列 之 TCP数据接收

  虽说仍然是Sweet Snippet,不过本篇并没有代码,纯粹是自己觉得有点趣味,就索性一记了~

8310

扫码关注云+社区

领取腾讯云代金券