设计模式(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,安全代理,控制真实对象的访问权限,不让外部看到真实的网络情况。上边的例子就是一个比较好的实例。

posted @ 2011-04-16 16:16  skyme  阅读(1592)  评论(1编辑  收藏  举报