設計模式(5)-己所不欲,施之於人(代理模式)
阿新 • • 發佈:2022-05-04
什麼是代理?在我們的日常生活中的例子非常多。
比如上網有的時候使用代理伺服器,通過代理上網,這就是代理的一個非常常見的例子。
從這裡邊可以看到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,安全代理,控制真實物件的訪問許可權,不讓外部看到真實的網路情況。上邊的例子就是一個比較好的例項。