代理模式

背景

在某些情況下,一個客戶不想或者不能直接引用一個對象,此時可以通過一個稱之為“代理”的第三者來實(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)建。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容