在 Gof 的書中對Proxy模式的目的給定為:為其它的物件提供一種代理,以控制對這個物件的訪問。由這句話所延伸出來的意思是,根據(jù)您的目的不同,您的代理物件將負有不同的責任,因為產(chǎn)生多種不同的代理情況。
根據(jù)不同的代理目的,而有不同的代理情況,在Gof中所舉的一個例子是Virtual Proxy,當中舉一個文檔中內(nèi)嵌圖片的例子,假設(shè)您的圖片是在文檔分頁的後面,一開始您並不用直接載入圖片,而使用一個虛代理物件,代替圖片被載入,以求開啟一個文檔的時候,速度能夠加快。當您捲動文檔至該顯示圖片的頁數(shù)時,這時再載入圖片。

如上圖所示,當文檔被開啟時,ImageProxy物件代理Image物件被載入,在還沒捲動至圖片顯示處時,也就是還沒有調(diào)用 ImageProxy的draw()時,圖片並不會被載入,因而可以加速文檔的開啟與節(jié)省記憶體的使用;如果需要顯示圖片了,ImageProxy的 draw()會被調(diào)用,而這時才真正創(chuàng)建Image物件,以從硬碟中載入圖片。
Proxy模式的 UML 結(jié)構(gòu)圖如下所示:

在調(diào)用RealSubject的request()之前,Proxy物件也許會有一些預(yù)先處理的操作,就假設(shè)我們組織為preOperation()與 postOperation()好了,當客戶對Proxy發(fā)出request()請求後,一個可能的時序圖如下所示:

您的preOperation()與postOperation()正決定了Proxy模式使用於何種情況,例如一個Remote Proxy的情況,可以為一個遠端真實物件提供一個局部代表;Protection Proxy控制對物件的訪問,您可以使用它來作不同級別、權(quán)限的存取控制;Cache Proxy為一個物件提供臨時的儲存,使得許多客戶端都能直接存取它,而不用對真實物件直接要求,只有在必要的時候更新這個臨時物件,或是讓客戶直接存取真實物件。
根據(jù)不同的代理目的,而有不同的代理情況,在Gof中所舉的一個例子是Virtual Proxy,當中舉一個文檔中內(nèi)嵌圖片的例子,假設(shè)您的圖片是在文檔分頁的後面,一開始您並不用直接載入圖片,而使用一個虛代理物件,代替圖片被載入,以求開啟一個文檔的時候,速度能夠加快。當您捲動文檔至該顯示圖片的頁數(shù)時,這時再載入圖片。

如上圖所示,當文檔被開啟時,ImageProxy物件代理Image物件被載入,在還沒捲動至圖片顯示處時,也就是還沒有調(diào)用 ImageProxy的draw()時,圖片並不會被載入,因而可以加速文檔的開啟與節(jié)省記憶體的使用;如果需要顯示圖片了,ImageProxy的 draw()會被調(diào)用,而這時才真正創(chuàng)建Image物件,以從硬碟中載入圖片。
Proxy模式的 UML 結(jié)構(gòu)圖如下所示:

在調(diào)用RealSubject的request()之前,Proxy物件也許會有一些預(yù)先處理的操作,就假設(shè)我們組織為preOperation()與 postOperation()好了,當客戶對Proxy發(fā)出request()請求後,一個可能的時序圖如下所示:

您的preOperation()與postOperation()正決定了Proxy模式使用於何種情況,例如一個Remote Proxy的情況,可以為一個遠端真實物件提供一個局部代表;Protection Proxy控制對物件的訪問,您可以使用它來作不同級別、權(quán)限的存取控制;Cache Proxy為一個物件提供臨時的儲存,使得許多客戶端都能直接存取它,而不用對真實物件直接要求,只有在必要的時候更新這個臨時物件,或是讓客戶直接存取真實物件。