1. 程式人生 > 其它 >設計模式(5)-己所不欲,施之於人(代理模式)

設計模式(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,安全代理,控制真實物件的訪問許可權,不讓外部看到真實的網路情況。上邊的例子就是一個比較好的例項。