前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(5)-己所不欲,施之于人(代理模式)

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

作者头像
cloudskyme
发布2018-03-20 16:56:54
4750
发布2018-03-20 16:56:54
举报
文章被收录于专栏:cloudskymecloudskyme

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

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

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

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

 对应的类图关系如下:

如图:

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

生成的文件如下:

client.h

代码语言:javascript
复制
class Client
{

public:
	Client();
	virtual ~Client();

};

client.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#include <iostream>

using namespace std;

class Network
{

public:
	Network();
	virtual ~Network();

	virtual void browse() = 0;

};

Network.cpp

代码语言:javascript
复制
#include "Network.h"


Network::Network(){

}

Network::~Network(){

}

ProxyNetwork.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#include "Network.h"

class RealNetwork : public Network
{

public:
	RealNetwork();
	virtual ~RealNetwork();

	virtual void browse();

};

RealNetwork.cpp

代码语言:javascript
复制
#include "RealNetwork.h"


RealNetwork::RealNetwork(){

}

RealNetwork::~RealNetwork(){

}

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

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-04-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档