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

淺析.NET開發(fā)中代理模式的使用

[摘要]當(dāng)我們需要使用的對(duì)象很復(fù)雜或者需要很長(zhǎng)時(shí)間去構(gòu)造,這時(shí)就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個(gè)對(duì)象很耗費(fèi)時(shí)間和計(jì)算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實(shí)際的對(duì)象。一個(gè)代理(Proxy)通常包含和將要使用的對(duì)象同樣的方法,一旦開始使用這個(gè)對(duì)象,這些方法將通...

  當(dāng)我們需要使用的對(duì)象很復(fù)雜或者需要很長(zhǎng)時(shí)間去構(gòu)造,這時(shí)就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個(gè)對(duì)象很耗費(fèi)時(shí)間和計(jì)算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實(shí)際的對(duì)象。一個(gè)代理(Proxy)通常包含和將要使用的對(duì)象同樣的方法,一旦開始使用這個(gè)對(duì)象,這些方法將通過(guò)代理(Proxy)傳遞給實(shí)際的對(duì)象。

  一些可以使用代理模式(Proxy)的情況:

  1、一個(gè)對(duì)象,比如一幅很大的圖像,需要載入的時(shí)間很長(zhǎng)。

  2、一個(gè)需要很長(zhǎng)時(shí)間才可以完成的計(jì)算結(jié)果,并且需要在它計(jì)算過(guò)程中顯示中間結(jié)果

  3、一個(gè)存在于遠(yuǎn)程計(jì)算機(jī)上的對(duì)象,需要通過(guò)網(wǎng)絡(luò)載入這個(gè)遠(yuǎn)程對(duì)象則需要很長(zhǎng)時(shí)間,特別是在網(wǎng)絡(luò)傳輸高峰期。

  4、一個(gè)對(duì)象只有有限的訪問(wèn)權(quán)限,代理模式(Proxy)可以驗(yàn)證用戶的權(quán)限

  代理模式(Proxy)也可以被用來(lái)區(qū)別一個(gè)對(duì)象實(shí)例的請(qǐng)求和實(shí)際的訪問(wèn),例如:在程序初始化過(guò)程中可能建立多個(gè)對(duì)象,但并不都是馬上使用,代理模式(Proxy)可以載入需要的真正的對(duì)象。

  這是一個(gè)需要載入和顯示一幅很大的圖像的程序,當(dāng)程序啟動(dòng)時(shí),就必須確定要顯示的圖像,但是實(shí)際的圖像只能在完全載入后才可以顯示!這時(shí)我們就可以使用代理模式(Proxy)。

  這個(gè)代理模式(Proxy)可以延遲實(shí)際圖像的載入,直到它接收到一個(gè)paint請(qǐng)求。在實(shí)際圖像的載入期間我們可以通過(guò)代理模式(Proxy)在實(shí)際圖像要顯示的位置預(yù)先載入一個(gè)比較小、簡(jiǎn)單的圖形。

  圖像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 Boolean
  Return done
 End Function

 Public Function getImage() As Image
  Dim img As Imager
  '顯示預(yù)先的圖像,直到實(shí)際圖像載入完成
  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

  定義一個(gè)簡(jiǎn)單的接口:

Public Interface Imager
 Function getImage() As image
End Interface

  實(shí)現(xiàn)接口:

  預(yù)先載入的圖像的類:

Public Class QuickImage

 Implements Imager
 Public Function getImage() As Image Implements Imager.getImage
  Return New bitmap("Box.gif")
 End Function

End Class

  載入實(shí)際圖像的類:

Public Class FinalImage

 Implements Imager

 Public Function getImage() As Image Implements Imager.getImage
  Return New Bitmap("flowrtree.jpg")
 End Function

End Class

  在顯示圖像的窗體中,定義一個(gè)圖像代理的(Proxy)實(shí)例,在載入圖像按鈕事件中,載入圖像:

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é):

  這只是一個(gè)很簡(jiǎn)單的例子(例子來(lái)自于《c#設(shè)計(jì)模式》),通過(guò)這個(gè)例子可以對(duì)代理(Proxy)有初步的認(rèn)識(shí)!Adapter模式和代理模式(Proxy)都是在對(duì)象間構(gòu)造一個(gè)簡(jiǎn)單的層。然而,Adapter模式向?qū)ο筇峁┮粋(gè)不同的接口,代理模式(Proxy)為對(duì)象提供相同的接口。