設(shè)計模式之代理模式(Proxy)
發(fā)表時間:2024-01-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]當(dāng)我們需要使用的對象很復(fù)雜或者需要很長時間去構(gòu)造,這時就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個對象很耗費時間和計算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實際的對象。一個代理(Proxy)通常包含和將要使用的對象同樣的方法,一旦開始使用這個對象,這些方法將通...
當(dāng)我們需要使用的對象很復(fù)雜或者需要很長時間去構(gòu)造,這時就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個對象很耗費時間和計算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實際的對象。一個代理(Proxy)通常包含和將要使用的對象同樣的方法,一旦開始使用這個對象,這些方法將通過代理(Proxy)傳遞給實際的對象。 一些可以使用代理模式(Proxy)的情況: 一個對象,比如一幅很大的圖像,需要載入的時間很長。 一個需要很長時間才可以完成的計算結(jié)果,并且需要在它計算過程中顯示中間結(jié)果
一個存在于遠(yuǎn)程計算機(jī)上的對象,需要通過網(wǎng)絡(luò)載入這個遠(yuǎn)程對象則需要很長時間,特別是在網(wǎng)絡(luò)傳輸高峰期。 一個對象只有有限的訪問權(quán)限,代理模式(Proxy)可以驗證用戶的權(quán)限 代理模式(Proxy)也可以被用來區(qū)別一個對象實例的請求和實際的訪問,例如:在程序初始化過程中 可能建立多個對象,但并不都是馬上使用,代理模式(Proxy)可以載入需要的真正的對象。 這是一個需要載入和顯示一幅很大的圖像的程序,當(dāng)程序啟動時,就必須確定要顯示的圖像,但是實際的圖像只能在完全載入后才可以顯示!這時我們就可以使用代理模式(Proxy)。 這個代理模式(Proxy)可以延遲實際圖像的載入,直到它接收到一個paint請求。在實際圖像的載入期間我們可以通過代理模式(Proxy)在實際圖像要顯示的位置預(yù)先載入一個比較小、簡單的圖形。 圖像Proxy代碼: Public Class ImageProxy Private done As Boolean Private tm As Timer Public Sub New() done = False '設(shè)置timer 延遲5秒 tm = New Timer( _ New TimerCallback(AddressOf tCallback), Me, 5000, 0) End Sub Public Function isReady() As BooleanReturn done End Function Public Function getImage() As Image Dim img As Imager '顯示預(yù)先的圖像,直到實際圖像載入完成 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 實現(xiàn)接口: 預(yù)先載入的圖像的類:Public Class QuickImage Implements ImagerPublic 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 Form1 = 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 總結(jié): 這只是一個很簡單的例子(例子來自于《c#設(shè)計模式》),通過這個例子可以對代理(Proxy)有初步的認(rèn)識!Adapter模式和代理模式(Proxy)都是在對象間構(gòu)造一個簡單的層。然而,Adapter模式向?qū)ο筇峁┮粋不同的接口,代理模式(Proxy)為對象提供相同的接口