【代理模式應用場景舉例】
比如在玩“極品飛車”這款遊戲,如果遊戲者手中的金錢達到了一定的數量就可以到車店買一部性能更高的賽車,那麼這個賣車的“車店”就是一個典型的“汽車廠家”的“代理”,他爲汽車廠家“提供賣車的服務”給有需求的人士。從面向對象的方面考慮,“銷售汽車的代理”也是一個對象,那麼這個對象也具有一定的狀態,在軟件項目中這個對象也具有管理財務進銷存的基本功能,那麼在設計時就要以面向OOP編程的思想來考慮軟件的類結構,這個銷售汽車的代理也是一個類了。
【代理模式解釋】
類型:結構模式
對一些對象提供代理,以限制那些對象去訪問其它對象。
【代理模式UML圖】
【代理模式-JAVA代碼實現】
新建一個買車的接口:
package buy_car_package; public interface buy_car_package { public void buy_car(); } |
新建一個people人類,具有買車的行爲,所以實現接口buy_car_package:
package buy_car_imple; import buy_car_package.buy_car_package; public class people implements buy_car_package { private int cash; private String username; public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public void buy_car() { System.out.println(username + "買了一臺新車"); } } |
people類不能擁有車,必須經過proxy代理類的認證,符合條件之後纔可以擁有車輛,新建一個代理,這個代理類來考察當前的people是否有資格進行買車:
package buy_car_imple; import buy_car_package.buy_car_package; public class proxy_buy_car_imple implements buy_car_package { private people people; public people getPeople() { return people; } public void setPeople(people people) { this.people = people; } public void buy_car() { if (people.getCash() > 3000) { System.out.println(people.getUsername() + "花" + people.getCash() + "塊 買了新車 交易結束"); } else { System.out.println(people.getUsername() + "金錢不夠,請繼續比賽!"); } } } |
最後創建一個客戶端,用來模擬買車的行爲:
package run_main; import buy_car_imple.people; import buy_car_imple.proxy_buy_car_imple; public class run_main { public static void main(String[] args) { people people_ref1 = new people(); people_ref1.setCash(4000); people_ref1.setUsername("高洪巖"); people people_ref2 = new people(); people_ref2.setCash(2000); people_ref2.setUsername("巖洪高"); proxy_buy_car_imple proxy_buy_car_imple = new proxy_buy_car_imple(); proxy_buy_car_imple.setPeople(people_ref1); proxy_buy_car_imple.buy_car(); proxy_buy_car_imple.setPeople(people_ref2); proxy_buy_car_imple.buy_car(); } } |
程序運行結果如下:
高洪巖花4000塊 買了新車 交易結束 巖洪高金錢不夠,請繼續比賽! |
這樣people就不可能自由的擁有車輛,必須經過proxy的認證之後纔可以。
而代理模式在GOF四人幫的介紹中大體有4種使用情景:
(1)遠程代理。典型的就是客戶端與webservice使用的情況,客戶端由於是針對OOP編程,而不是針對webservice中的方法進行編程,所以得在客戶端模擬一下webservice的環境,用proxy來對webservice進行包裝,這樣就可以使用proxy代理類來遠程操作webservice了。
(2)虛擬代理。比如你要開發一個大文檔查看軟件,大文檔中有大的圖片,有可能一個圖片有100MB,在打開文件時不可能將所有的圖片都顯示出來,這樣就可以使用代理模式,當需要查看圖片時,用proxy來進行大圖片的打開。
(3)安全代理。其實也就是本例中所舉的買車的例子,金錢不夠不可以買車!
(4)智能指引。比如在訪問一個對象時檢測其是否被鎖定等情況。
【代理模式-MyEclipse6項目JAVA代碼實現】
代理模式proxy示例代碼:點擊