代理模式(为对象提供相同的接口)
一、代理模式
代理模式,即Proxy,讓你能夠提供對象的替代品或其占位符。 代理控制著對于原對象的訪問, 并允許在將請求提交給對象前后進行一些處理。它和Adapter模式很類似。我們先回顧Adapter模式,它用于把A接口轉換為B接口:
public BAdapter implements B {private A a;public BAdapter(A a) {this.a = a;}public void b() {a.a();} }而Proxy模式不是把A接口轉換成B接口,它還是轉換成A接口:
public AProxy implements A {private A a;public AProxy(A a) {this.a = a;}public void a() {this.a.a();} }二、 為什么要使用代理模式控制對于某個對象的訪問呢
為什么要使用代理模式控制對于某個對象的訪問呢? 舉個例子: 有這樣一個消耗大量系統資源的巨型對象, 你只是偶爾需要使用它, 并非總是需要。
代理模式解決的問題
數據庫查詢有可能會非常緩慢。你可以實現延遲初始化: 在實際有需要時再創建該對象。 對象的所有客戶端都要執行延遲初始代碼。 不幸的是, 這很可能會帶來很多重復代碼。
在理想情況下, 我們希望將代碼直接放入對象的類中, 但這并非總是能實現: 比如類可能是第三方封閉庫的一部分。
代理模式建議新建一個與原服務對象接口相同的代理類, 然后更新應用以將代理對象傳遞給所有原始對象客戶端。 代理類接收到客戶端請求后會創建實際的服務對象, 并將所有工作委派給它。
代理將自己偽裝成數據庫對象, 可在客戶端或實際數據庫對象不知情的情況下處理延遲初始化和緩存查詢結果的工作。
這有什么好處呢? 如果需要在類的主要業務邏輯前后執行一些工作, 你無需修改類就能完成這項工作。 由于代理實現的接口與原類相同, 因此你可將其傳遞給任何一個使用實際服務對象的客戶端。
三、代理模式的結構
很重要的一點就是:代理類必須和服務對象實現相同的接口,才能偽裝成服務對象
四、代碼實現及詳解
參考
五、 代理模式適合應用場景
使用代理模式的方式多種多樣, 我們來看看最常見的幾種。
延遲初始化 (虛擬代理)。 如果你有一個偶爾使用的重量級服務對象, 一直保持該對象運行會消耗系統資源時, 可使用代理模式。
你無需在程序啟動時就創建該對象, 可將對象的初始化延遲到真正有需要的時候。
訪問控制 (保護代理)。 如果你只希望特定客戶端使用服務對象, 這里的對象可以是操作系統中非常重要的部分, 而客戶端則是各種已啟動的程序(包括惡意程序), 此時可使用代理模式。
4.代理可僅在客戶端憑據滿足要求時將請求傳遞給服務對象。
本地執行遠程服務 (遠程代理)。 適用于服務對象位于遠程服務器上的情形。
在這種情形中, 代理通過網絡傳遞客戶端請求, 負責處理所有與網絡相關的復雜細節。
記錄日志請求 (日志記錄代理)。 適用于當你需要保存對于服務對象的請求歷史記錄時。 代理可以在向服務傳遞請求前進行記錄。
緩存請求結果 (緩存代理)。 適用于需要緩存客戶請求結果并對緩存生命周期進行管理時, 特別是當返回結果的體積非常大時。
- 代理可對重復請求所需的相同結果進行緩存, 還可使用請求參數作為索引緩存的鍵值。
智能引用。可在沒有客戶端使用某個重量級對象時立即銷毀該對象。
代理會將所有獲取了指向服務對象或其結果的客戶端記錄在案。
代理會時不時地遍歷各個客戶端, 檢查它們是否仍在運行。
如果相應的客戶端列表為空, 代理就會銷毀該服務對象, 釋放底層系統資源。 代理還可以記錄客戶端是否修改了服務對象。 其他客戶端還可以復用未修改的對象。
六、與其他模式的關系
適配器模式能為被封裝對象提供不同的接口, 代理模式能為對象提供相同的接口, 裝飾模式則能為對象提供加強的接口。
外觀模式與代理的相似之處在于它們都緩存了一個復雜實體并自行對其進行初始化。 代理與其服務對象遵循同一接口, 使得自己和服務對象可以互換,在這一點上它與外觀不同。
裝飾和代理有著相似的結構, 但是其意圖卻非常不同。 這兩個模式的構建都基于組合原則, 也就是說一個對象應該將部分工作委派給另一個對象。兩者之間的不同之處在于代理通常自行管理其服務對象的生命周期, 而裝飾的生成則總是由客戶端進行控制。
參考文章
參考文章
總結
以上是生活随笔為你收集整理的代理模式(为对象提供相同的接口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公司裁员优先裁掉这类员工
- 下一篇: 2021年中国在线旅游直播专题分析