當我們需要使用的對象很復雜或者需要很長時間去構造 這時就可以使用代理模式(Proxy) 例如 如果構建壹個對象很耗費時間和計算機資源 代理模式(Proxy)允許我們控制這種情況 直到我們需要使用實際的對象 壹個代理(Proxy)通常包含和將要使用的對象同樣的方法 壹旦開始使用這個對象 這些方法將通過代理(Proxy)傳遞給實際的對象 壹些可以使用代理模式(Proxy)的情況
壹個對象 比如壹幅很大的圖像 需要載入的時間很長
壹個需要很長時間才可以完成的計算結果 並且需要在它計算過程中顯示中間結果
壹個存在於遠程計算機上的對象 需要通過網絡載入這個遠程對象則需要很長時間 特別是在網絡傳輸高峰期
壹個對象只有有限的訪問權限 代理模式(Proxy)可以驗證用戶的權限
代理模式(Proxy)也可以被用來區別壹個對象實例的請求和實際的訪問 例如 在程序初始化過程中
可能建立多個對象 但並不都是馬上使用 代理模式(Proxy)可以載入需要的真正的對象
這是壹個需要載入和顯示壹幅很大的圖像的程序 當程序啟動時 就必須確定要顯示的圖像 但是實際的圖像只能在完全載入後才可以顯示!這時我們就可以使用代理模式(Proxy)
這個代理模式(Proxy)可以延遲實際圖像的載入 直到它接收到壹個paint請求 在實際圖像的載入期間我們可以通過代理模式(Proxy)在實際圖像要顯示的位置預先載入壹個比較小 簡單的圖形
圖像Proxy代碼
Public Class ImageProxy
Private done As Boolean
Private tm As Timer
Public Sub New()
done = False
&# ;設置timer 延遲 秒
tm = New Timer( _
New TimerCallback(AddressOf tCallback) Me )
End Sub
Public Function isReady() As Boolean
Return done
End Function
Public Function getImage() As Image
Dim img As Imager
&# ;顯示預先的圖像 直到實際圖像載入完成
If isReady Then
img = New FinalImage()
Else
img = New QuickImage()
End If
Return img getImage
End Function
Public Sub tCallback(ByVal obj As Object)
done = True
tm Dispose()
End Sub
End Class
定義壹個簡單的接口
Public Interface Imager
Function getImage() As image
End Interface
實現接口
預先載入的圖像的類
Public Class QuickImage
Implements Imager
Public Function getImage() As Image _
Implements Imager getImage
Return New bitmap(&# ;Box gif&# ;)
End Function
End Class
載入實際圖像的類
Public Class FinalImage
Implements Imager
Public Function getImage() As Image _
Implements Imager getImage
Return New Bitmap(&# ;flowrtree jpg&# ;)
End Function
End Class
在顯示圖像的窗體中 定義壹個圖像代理的(Proxy)實例 在載入圖像按鈕事件中 載入圖像
Private imgProxy As ImageProxy
Public Sub New()
MyBase New
Form = Me
InitializeComponent
imgproxy = New ImageProxy()
End Sub
Protected Sub btLoad_Click(ByVal sender As Object ByVal e As System EventArgs) Handles btLoad Click
pic Image = imgProxy getImage
End Sub
總結
lishixinzhi/Article/program/ASP/201405/30785