明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

設(shè)計模式之代理模式(Proxy)

[摘要]當(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)為對象提供相同的接口