Proxy模式简介和用例
??? 在軟件系統中,有些對象有時候由于某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),如果直接訪問會給使用者或者系統結構帶來很多麻煩,這時可以在客戶程序和目標對象之間增加一層中間層,這個中間層就是代理。
??? 代理模式的定義:給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。
代理模式可分為以下幾類:
(1)遠程代理:為一個位于不同的地址空間的對象提供一個局域代表對象。好處是系統可以將網絡的細節隱藏起來,使得客戶端不必考慮網絡的存在。
(2)保護代理:控制對一個對象的訪問,如果需要可以給不同的用戶提供不同級別的使用權限。好處是它可以在運行時間對用戶的有關權限進行檢查,然后在核實后決定將調用傳遞給被代理的對象。
(3)虛擬代理:根據需要創建一個資源消耗較大的對象,使得此對象只在需要時才會被真正創建。好處是代理對象可以在必要的時候才將被代理的對象加載。
(4)智能引用代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
這里給出兩個使用該模式的例子:
應用一:虛擬代理
例如:word文檔打開
Word文檔通常會含有鏈接、圖片、表格等對象,但是并不是每次剛打開word時都要創建和實例化這些對象,特別是實例化圖片對象很消耗資源。事實上,我們沒必要實例化所有圖片,當我們在查看word時,每次只是看到其中的一部分,所以沒有必要實例化所有資源,可以使用一個虛代理物件,代替圖片被載入,來加快打開文檔速度,當我們看下一頁時再載入圖片也不遲。
類圖如圖所示:
如上圖所示,當文檔被開啟時, ProxyImage代理代替RealImage物件被載入,在還沒卷動至圖片顯示處時,也就是還沒有調用 ProxyImage的Draw()時,圖片并不會被載入,因而可以加速文檔的開啟;如果需要顯示圖片了, ProxyImage的 Draw()會被調用,而這時才真正創建RealImage物件,以從硬盤中載入圖片。
主要類代碼:
?
public interface Image //Image公共接口 {public abstract void Draw();}//ProxyImage類實現Image接口public class ProxyImage implements Image{private RealImage realimage;public void Draw(){If(realimage==NULL){Realimage=new RealImage();}realimage.Draw();}}//RealImage類實現Image接口public class RealImage implements Image{public void Draw(){ Console.WriteLine(“載入圖片……”);}}主程序public class App{public static void Main(){ProxyImage proxy = new ProxyImage();proxy.Draw();}}?
應用二:遠程訪問
例子:遠程數學運算訪問
本地客戶程序需要調用遠程服務器提供的數學運算服務,也就是說數學運算服務和客戶程序不在同一個地址空間之內,我們現在要面對的是跨越Internet這樣一個網絡障礙:這時候調用數學運算服務就沒有下面那么簡單了,因為我們更多的還要去考慮網絡的問題,對接收到的結果解包等一系列操作。為了避免由于網絡等障礙引起的復雜性,引用Proxy模式,用一個本地的代理來代替遠程數學運算類打點一切,即為我們的系統引入了一層間接層,示意圖如下
設計的類圖如下:
如上圖所示:我們在ProxMath中對實現數據類的訪問,讓ProxyMath來代替網絡上的RealMath類,這樣我們看到ProxMathy就好像是本地RealMath類,它與客戶程序處在了同一地址空間內。
主要代碼:
View Code public interface Math //Math公共接口 {public abstract double Add(double x,double y);public abstract double Sub(double x,double y);public abstract double Mul(double x,double y);public abstract double Dev(double x,double y);}public class ProxyMath implements Math //Proxy類,繼承于Math {private RealMath realmath = new RealMath();//Proxy類中不光有調用Math類的方法,還包含一些網絡通信,與遠程服務器交換數據,此處省略。public double Add(double x,double y){return math.Add(x,y);}public double Sub(double x,double y){return realmath.Sub(x,y);}public double Mul(double x,double y){return realmath.Mul(x,y);}public double Dev(double x,double y){return realmath.Dev(x,y);}}public class RealMath implements Math{public double Add(double x,double y){return x + y;}public double Sub(double x,double y){return x - y;}public double Mul(double x,double y){return x * y;}public double Dev(double x,double y){return x / y;}}測試主程序public class App{public static void Main(){ProxyMath proxy = new ProxyMath();double addresult = proxy.Add(2,3);double subresult = proxy.Sub(2,3);double mulresult = proxy.Mul(2,3);double devresult = proxy.Dev(2,3);}}?
從上面的兩個例子可以概括出Proxy模式的工作原理:
首先,代理并不改變主題的接口,因為模式的用意是不讓客戶端感覺到代理的存在;其次,代理使用委派將客戶端的調用委派給真實的主題對象,換言之,代理起到的是一個傳遞請求的作用;第三,代理在傳遞請求之前和之后都可以執行特定的操作(如網絡通信、檢查對象是否存在等),而不是單純傳遞請求。
轉載于:https://www.cnblogs.com/Yogurshine/archive/2012/12/25/2831860.html
總結
以上是生活随笔為你收集整理的Proxy模式简介和用例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 分页查询语句大全即(查找第N到M
- 下一篇: hibernate中的id特殊属性hil