设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问.
为什么要使用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