posts - 73,  comments - 55,  trackbacks - 0

设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问.

为什么要使用Proxy?
1.授权机制

我们开发一个应用系统时,用户请求任何页面都要经过权限控制,最早开发的时候我们常常封装一个权限验证方法,然后在每个jsp或者对应的servlet中增加相关代码,但是用户对权限的需求往往是多变的,这样一旦权限验证方法变化(参数变化,增加方法),如果开发的系统很庞大的话,有可能你就需要修改几百个jsp页面或者servlet代码。
还有我们常需要判断session是否过期,如果过期就要重新登陆系统,如果每个页面或者servlet都要加判断代码,那也是件比较痛苦的事情。
如果我们采用代理模式,增加Proxy对象,每次用户请求必须通过proxy对象处理,由它专门处理相关权限控制,一旦权限需求变化了,只需要修改Proxy对象相关的实现方法。

2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
举例4个具体情况:
u 一个对象,比如一幅很大的图像,需要载入的时间很长。

u 一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果

u 一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。

u 一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限


总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系.


简单实例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface AnInterface {
 public void doSomething();
}

class AClass implements AnInterface {
 public void doSomething() {
  System.out.println("Inside Method AClass.doSomething()");
 }
}

class SimpleInvocationHandler implements InvocationHandler {
 public SimpleInvocationHandler(Object realSubject) {
  this.realSubject = realSubject;
 }

 public Object invoke(Object proxy, Method m, Object[] args) {
  Object result = null;
  System.out.println("Before Calling " + m.getName());
  try {
   result = m.invoke(realSubject, args);
  } catch (Exception ex) {
   System.exit(1);
  }
  System.out.println("After Calling " + m.getName());
  return result;
 }

 private Object realSubject = null;
}

public class Test {
 public static void main(String args[]) {
  AnInterface realSubject = new AClass();
  AnInterface proxy = (AnInterface) Proxy.newProxyInstance(realSubject
    .getClass().getClassLoader(), realSubject.getClass()
    .getInterfaces(), new SimpleInvocationHandler(realSubject));
  passMeAProxy(proxy);
 }

 private static void passMeAProxy(AnInterface anInterface) {
  anInterface.doSomething();
 }
}

posted on 2006-07-25 14:28 保尔任 阅读(574) 评论(1)  编辑  收藏 所属分类: Design Patten

FeedBack:
# re: Proxy(代理)模式
2007-11-08 20:57 | 李钦钦
今天谢谢你的帮助.祝你好运  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜