代理模式:為其他對象提供一種代理以控制對這個對象的訪問。
為什么要使用Proxy?
1.授權機制 不同級別的用戶對同一對象擁有不同的訪問權利,如Jive論壇系統中,就使用Proxy進行授權機制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權限.
2.某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動.
舉例兩個具體情況:
(1)如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那么當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片.
(2)如果那個對象在Internet的某個遠端服務器上,直接操作這個對象因為網絡速度原因可能比較慢,那我們可以先用Proxy來代替那個對象.
總之原則是,對于開銷很大的對象,只有在使用它時才創建,這個原則可以為我們節省很多寶貴的Java內存. 所以,有些人認為Java耗費資源內存,我以為這和程序編制思路也有一定的關系.
一個簡單的例子:
抽象主題:
package?proxy;

public?abstract?class?Subject
{
????//請求方法
????public?abstract?void??request();
}真實類:
package?proxy;


public?class?RealSubject?extends?Subject
{
????//實現請求方法

????public?void?request()
{
????????System.out.println("From?real?subject");
????}
????
}代碼類:
package?proxy;


public?class?ProxySubject?extends?Subject?
{
????private?Subject?realSubject=null;
????//實現請求方法

????public?void??request()
{
????????//還可以執行一些額外的操作

????????if(realSubject==null)
{
????????????realSubject=new?RealSubject();
????????????realSubject.request();
????????}else
??????????realSubject.request();
????}
}運行類:
package?proxy;

public?class?ProxyPattern
{
????

????public?static?void?main(String[]?args)
{
????????Subject?proxySubject=new?ProxySubject();
????????proxySubject.request();
????}
}代理模式與其它模式的區別:
??? 裝飾模式:應該為所裝飾的對象增強功能,而代理模式對對象的使用施加控制,并不提供對象本身功能的增強。(來處《java與模式》,不明白).
??? 與外觀模式基本上一樣.(是這樣的嗎?)
參考資料: "Java 與模式"
http://blog.csdn.net/qutr/archive/2006/07/27/987253.aspxhttp://www.jdon.com/designpatterns/designpattern_proxy.htm