?
?? Proxy模式之春節回家
1.?? 引言
昨天晚上,老媽打電話過來,問我買到火車票沒有,什麼時候能回家,言語中非常著急,這讓我想起了往事。我去年在成都,回家是非常方便的,包括春節。因為在成都,火車票非常好買。老媽從不用擔心我回家買不到車票,在她眼中,我買票相當於下面的類:
Package com.hongsoft.test;
Abstract public class GoHome
{
?? abstract public boolean buyTicket();
}
老媽眼中, buyTicket()方法總是返回true的,所以春節期間她從不過問我買票的事;我實際是怎麼買到的票呢?
2.?? 平常買票的辦法
我在成都買票都是自己去買的,如下:
package com.hongsoft.test;
public class RealGoHome extends GoHome
{
??? public boolean buyTicket()
??? {
??????? System.out.println(“掏錢,買票”);
??? }
}
正如老媽所想的那樣, buyTicket()方法總是返回true的,所以我總能很順利的買到票回家;但今年春節,不行了。
3.?? 今年買票的辦法
我今年到了廣州,廣州春節的票可真難買!我調用我的buyTicket()方法好多遍了,可每次都返回false,沒票!怎麼辦呢?不回去可不行啊,無奈中,我想到了火車票代理處。
我知道春節期間代理處是這麼買票的:
package com.hongsoft.test;
public class ProxyGoHome extends GoHome
{
??? private RealGoHome realGoHome;
??? //實現買票方法
??? public boolean buyTicket()
??? {
?????? preBuy();
?????? if(realGoHome==null)
?????????? realGoHome=new RealGoHome();
?????? realGoHome. buyTicket();
?????? postBuy();??????
??? }
??? //買票前的動作
??? private void preBuy()
??? {
?????? System.out.println(“打電話給關係人,讓關係人給售票點打聲招呼”);
??? }
??? //買票後的動作
??? private void postBuy()
??? {
?????? System.out.println(“請關係人Mixi Mixi”);
??? }
}
4.?? 總結
就這樣,通過火車票代理處,我今天順利地拿到了票!經驗總結如下:
1)????? 我通過火車票代理處買票的方式如下:
GoHome goHome=new ProxyGoHome();
GoHome.buyTicket();
但我聲明:代碼只用來學習Proxy模式,不能編譯運行!
2)???? 以上就是Proxy模式的應用,GoHome是抽象主體,RealGoHome是真實主體,ProxyGoHome是代理主體。
3)???? 應該在合適的地方應用該模式:
如果平常買票也用Proxy模式,不一定好,因為要花我的代理費啊!
但到了廣州的春節你還不用Proxy模式,………,呵呵,除非你不準備春節回家!
4)???? 本例中ProxyGoHome有preBuy()和postBuy()方法,在本例中,沒有他們,則買不到票;在實際的編程環境中,預先處理和後處理方法一般用來實現特定的功能:如管理資料庫串連,管理網路連接,實現存取控制,實現Cache,EJB用戶端預先處理等等。因為一個代理類為很多的客戶服務,所以,我們一般在預先處理和後處理方法中實現從代理中抽象出來的功能。
5) 要注意的是,Proxy是為客戶服務的,如本例,代理處是為我服務的;火車站不需要Proxy為火車站服務,這是Proxy模式與Facade模式的最本質的區別,以後的文章將會詳細分析這一點。
?
好了,就寫到這裡,我要給老媽打電話,讓她放心了!
?
hongbo781202,又名HongSoft,職業程式員,研究領域:1)基於工作流程的BPM系統研究2)基於JAVA的資訊安全
技術.歡迎和大家討論JAVA相關各方面技術和市場問題 hongbosoftware@163.com
?????