原帖地址 : http://blog.csdn.net/wdwgr/archive/2009/04/09/4060739.aspx
一. 代理模式:
代理模式就是給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。就是一個人或者一個機構代替另一個人或者另一個機構去采取一些行動。
二. 代理模式所涉及到的角色:
抽象角色:提供一種真實角色和代理角色所共有的接口
真實角色:定義了代理角色要代理的真實對象
代理角色:含有對真實角色的引用,通常在客戶端調用時代理對象都要在真實角色對象的基礎上增加一些真實角色所不能勝任的工作,而不只是簡單的含有真實角色的引用
三. 舉例:
跟MM在網上聊天,一開頭通常總是“hi”,“你好”, “你從哪里來?”, “你多大了”,等等這些話,真煩人,寫個程序為我做代理吧,凡是收到這些消息,都設置好了自動回復功能,接收到其他有價值的消息時在通知我回答,怎么樣,很酷吧,這都要歸功于這個代理類。
代碼:
1. /**
2. * 抽象角色,提供代理類和具體類的公共接口
3. * @author Administrator
4. *
5. */
6. public interface Chat {
7.
8. public void reply(String message);
9. }
10. /**
11. * 具體角色類,被代理的類
12. * @author Administrator
13. *
14. */
15. public class MyChat implements Chat{
16.
17. public void reply(String message) {
18.
19. System.out.println("需要我親自回復的內容。。。");
20. }
21. }
22. /**
23. * 代理類,持有被代理類的一個引用
24. * @author Administrator
25. *
26. */
27. public class ChatProxy implements Chat{
28.
29. private MyChat mc = new MyChat();
30.
31. public void reply(String message) {
32.
33. if(message.equals("hi,你好")) {
34. System.out.println("hi, 你也好");
35. }else if(message.equals("你從哪里來?")){
36. System.out.println("我來自中國。。。");
37. }else if(message.equals("你多大了?")) {
38. System.out.println("我今年22了。。。");
39. }
40. else {
41. mc.reply(message);
42. }
43. }
44. }
客戶端直接對代理類進行調用:
1. public class ProxyTest {
2.
3. public static void main(String[] args) {
4. //直接調用代理類
5. ChatProxy cp = new ChatProxy();
6.
7. //代理類提供的實現
8. cp.reply("hi,你好");
9. //具體類提供的實現
10. cp.reply("你喜歡我嗎?");
11. }
12. }
四. 總結:
在某些情況下,客戶不想或者不能直接引用一個對象,這個時候就用到了代理類,代理對象可以再客戶和目標對象之間起到中介的作用,客戶端分辨不出代理對象與真實對象的區別,代理模式可以不知道真正的代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建并傳入。
繼續努力,加油!