在
Gof 的書中對Proxy模式的目的給定為:為其它的物件提供一種代理,以控制對這個物件的訪問。由這句話所延伸出來的意思是,根據您的目的不同,您的代理物件將負有不同的責任,因為產生多種不同的代理情況。
根據不同的代理目的,而有不同的代理情況,在Gof中所舉的一個例子是Virtual Proxy,當中舉一個文檔中內嵌圖片的例子,假設您的圖片是在文檔分頁的後面,一開始您並不用直接載入圖片,而使用一個虛代理物件,代替圖片被載入,以求開啟一個文檔的時候,速度能夠加快。當您捲動文檔至該顯示圖片的頁數時,這時再載入圖片。
如上圖所示,當文檔被開啟時,ImageProxy物件代理Image物件被載入,在還沒捲動至圖片顯示處時,也就是還沒有調用 ImageProxy的draw()時,圖片並不會被載入,因而可以加速文檔的開啟與節省記憶體的使用;如果需要顯示圖片了,ImageProxy的 draw()會被調用,而這時才真正創建Image物件,以從硬碟中載入圖片。
Proxy模式的 UML 結構圖如下所示:
在調用RealSubject的request()之前,Proxy物件也許會有一些預先處理的操作,就假設我們組織為preOperation()與 postOperation()好了,當客戶對Proxy發出request()請求後,一個可能的時序圖如下所示:
您的preOperation()與postOperation()正決定了Proxy模式使用於何種情況,例如一個Remote Proxy的情況,可以為一個遠端真實物件提供一個局部代表;Protection Proxy控制對物件的訪問,您可以使用它來作不同級別、權限的存取控制;Cache Proxy為一個物件提供臨時的儲存,使得許多客戶端都能直接存取它,而不用對真實物件直接要求,只有在必要的時候更新這個臨時物件,或是讓客戶直接存取真實物件。