17 Proxy(代理,結構型)
-
- 動機:
- 代理模式給某一個對象提供一個代理對象,並由代理對象控制對原對象的引用。
- 只在必要時生成實例
- 控制對對象的訪問的一個原因是defer(推遲)創建和初始化的全部成本,直到我們需要使用它。
- 解決方案是使用另一個對象,代理,作爲真實對象的替身。
- 也稱爲:Surrogate
- JAVA RMI是JAVA RPC的版本,RPC如下,通過網絡調用遠端g(),回去研究一下RMI
- Java RMI: The client helper is a ‘stub’ and the service helper is a ‘skeleton’.
- Java遠程方法調用,即Java RMI(Java Remote Method Invocation)是Java編程語言裏,一種用於實現遠程過程調用的應用程序編程接口。它使客戶機上運行的程序可以調用遠程服務器上的對象。遠程方法調用特性使Java編程人員能夠在網絡環境中分佈操作。RMI全部的宗旨就是儘可能簡化遠程接口對象的使用。
- 什麼時候用:
- 遠程代理爲不同地址空間中的對象提供本地代表。
- 虛擬代理根據需要創建昂貴的對象。
- 保護代理控制對原始對象的訪問。
- 智能引用是一個空指針的替代,空指針在訪問對象時執行額外的操作。
- 計算對真實對象的引用數量,以便在沒有更多引用時自動釋放(智能指針)。
- 加載持久對象(持久化對象)到內存的時候第一次引用。
- 在訪問真實對象之前檢查它是否被鎖定,以確保沒有其他對象可以更改它。
- 結構:
- 後果:
- 遠程代理可以隱藏對象駐留在不同地址空間的事實。
- 虛擬代理可以執行優化,如按需創建對象。
- 保護代理和智能引用都允許訪問控制等附加功能。(在適用性頁面顯示)
- 寫時拷貝:
- 複製一個大而複雜的對象可能是一項昂貴的操作。如果副本從來沒有被修改過,那麼就沒有必要產生這個成本。通過使用代理來推遲複製過程,我們確保只在對象被修改時才複製它。
- 擴展:透明代理
- 代理並不總是需要知道真實主題的類型。
- 如果一個代理類可以通過一個抽象接口單獨處理它的subject,那麼就不需要爲每個RealSubject類創建一個代理類;該代理可以統一處理所有RealSubject類。
- 但是如果代理要實例化,那麼他們必須知道具體的類。
- 動機: