代理模式

微信公衆號:雲計算通俗講義
持續輸出技術乾貨,歡迎關注!
經過本文你將瞭解:
  • 背景
  • 概述
  • 模式結構
  • 代碼實現
  • 特色
  • 應用場景

 

背景
在某些狀況下,一個客戶不想或者不能直接引用一個對象,此時能夠經過一個稱之爲「代理」的第三者來實現間接引用。代理對象能夠在客戶端和目標對象之間起到中介的做用,而且能夠經過代理對象去掉客戶不能看到的內容和服務或者添加客戶須要的額外服務。
經過引入一個新的對象來實現對真實對象的操做或者將新的對象做爲真實對象的一個替身,這種實現機制即爲代理模式,經過引入代理對象來間接訪問一個對象,這就是代理模式的動機。

 

概述
代理模式(Proxy Pattern) :給某一個對象提供一個代理,並由代理對象控制對原對象的引用。代理模式的英文叫作Proxy或Surrogate,它是一種對象結構型模式。

 

模式結構
代理模式包含以下角色:
Subject: 抽象主題角色
抽象主題角色聲明瞭真實主題和代理主題的共同接口,實現了調用方和服務方的解耦。
Proxy: 代理主題角色
代理主題角色內部包含對真實主題的引用,從而能夠在任什麼時候候操做真實主題對象。
RealSubject: 真實主題角色
真實主題角色定義了代理角色所表明的真實對象,在真實主題角色中實現了真實的業務操做,客戶端能夠經過代理主題角色間接調用真實主題角色中定義的方法。
 

 

代碼實現
 
 
//抽象系統類 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; }

 

特色
優勢
代理模式可以協調調用者和被調用者,在必定程度上下降了系統的耦合度。
虛擬代理經過使用一個小對象來表明一個大對象,能夠減小系統資源的消耗,對系統進行優化並提升運行速度。
保護代理能夠控制對真實對象的使用權限。
缺點
額外增長了代理層,可能形成請求的請求響應變慢。
須要額外增長代理層的實現邏輯,可能會比較複雜。

 

應用場景
圖片代理
在Web中瀏覽大圖通常使用圖片代理實現,即用戶訪問某大圖時不時直接加載該圖片,這樣會很消耗網絡帶寬,而是採用先向客戶端瀏覽器加載一個小圖,而後在後臺加載大圖,這樣能夠大幅度提高用戶體驗。
遠程代理
遠程代理能夠將網絡的細節隱藏起來,使得客戶端沒必要考慮網絡的存在。
虛擬代理
虛擬代理模式是一種內存節省技術,那些佔用大量內存或處理複雜的對象將推遲到使用它的時候才建立。
相關文章
相關標籤/搜索