原帖地址 : 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. }
四. 总结:
在某些情况下,客户不想或者不能直接引用一个对象,这个时候就用到了代理类,代理对象可以再客户和目标对象之间起到中介的作用,客户端分辨不出代理对象与真实对象的区别,代理模式可以不知道真正的代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。
继续努力,加油!