背景
在某些情況下,一個客戶不想或者不能直接引用一個對象,此時可以通過一個稱之為“代理”的第三者來實(shí)現(xiàn)間接引用。代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用,并且可以通過代理對象去掉客戶不能看到的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)。
通過引入一個新的對象來實(shí)現(xiàn)對真實(shí)對象的操作或者將新的對象作為真實(shí)對象的一個替身,這種實(shí)現(xiàn)機(jī)制即為代理模式,通過引入代理對象來間接訪問一個對象,這就是代理模式的動機(jī)。
概述
代理模式(Proxy Pattern) :給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式的英文叫做Proxy或Surrogate,它是一種對象結(jié)構(gòu)型模式。
模式結(jié)構(gòu)
代理模式包含如下角色:
Subject: 抽象主題角色
抽象主題角色聲明了真實(shí)主題和代理主題的共同接口,實(shí)現(xiàn)了調(diào)用方和服務(wù)方的解耦。
Proxy: 代理主題角色
代理主題角色內(nèi)部包含對真實(shí)主題的引用,從而可以在任何時候操作真實(shí)主題對象。
RealSubject: 真實(shí)主題角色
真實(shí)主題角色定義了代理角色所代表的真實(shí)對象,在真實(shí)主題角色中實(shí)現(xiàn)了真實(shí)的業(yè)務(wù)操作,客戶端可以通過代理主題角色間接調(diào)用真實(shí)主題角色中定義的方法。
代碼實(shí)現(xiàn)
//抽象系統(tǒng)類
class AbstractCommonInterface{
public:
? virtual void run() = 0;
};
class MyFunc :public AbstractCommonInterface{
public:
? virtual void run(){
? ? cout << "run..." << endl;
? }
};
class MrFuncProxy:public AbstractCommonInterface{
public:
? MyFunc*pFunc;
? string mUserInfo;
public:
? MrSystemProxy(string userInfo){
? ? this->mUserInfo = userInfo;
? ? pFunc = new MyFunc;
? }
? ~MyFuncProxy(){
? ? if (NULL != pFunc) {
? ? ? delete pFunc;
? ? }
? }
? virtual void run(){
? ? if (checkUserInfo()){
? ? ? cout << "user info is right." << endl;
? ? ? this->pFunc->run();
? ? }
? ? else{
? ? ? cout << "error." << endl;
? ? }
? }
};
void ProxyFunc() {
? MyFuncProxy* proxy = new MyFuncProxy("root,123");
? proxy->run();
? delete proxy;
? proxy = new MyFuncProxy("admin,123");
? proxy->run();
? delete proxy;
}
特點(diǎn)
優(yōu)點(diǎn)
代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。
虛擬代理通過使用一個小對象來代表一個大對象,可以減少系統(tǒng)資源的消耗,對系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。
保護(hù)代理可以控制對真實(shí)對象的使用權(quán)限。
缺點(diǎn)
額外增加了代理層,可能造成請求的請求響應(yīng)變慢。
需要額外增加代理層的實(shí)現(xiàn)邏輯,可能會比較復(fù)雜。
應(yīng)用場景
圖片代理
在Web中瀏覽大圖一般使用圖片代理實(shí)現(xiàn),即用戶訪問某大圖時不時直接加載該圖片,這樣會很消耗網(wǎng)絡(luò)帶寬,而是采用先向客戶端瀏覽器加載一個小圖,然后在后臺加載大圖,這樣可以大幅度提升用戶體驗。
遠(yuǎn)程代理
遠(yuǎn)程代理可以將網(wǎng)絡(luò)的細(xì)節(jié)隱藏起來,使得客戶端不必考慮網(wǎng)絡(luò)的存在。
虛擬代理
虛擬代理模式是一種內(nèi)存節(jié)省技術(shù),那些占用大量內(nèi)存或處理復(fù)雜的對象將推遲到使用它的時候才創(chuàng)建。