通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,就像得到真实对象一样,操作这个代理对象时,实际上的功能还是依靠真实对象来完成,只不过是通过代理操作的,即,客户端操作代理,代理操作真正的对象。这样代理就如同一个中转,中转前后可以做很多事,判断权限,判断其它条件等。
代理接口Subject
package com.dev.model.proxy.staticProxy; /** * 静态代理接口 * @author Hust * @Time 2011-11-5 */ public interface Subject { void doSomeThing(); }
被代理的目标对象RealSubject类 实现Subject接口
package com.dev.model.proxy.staticProxy; /** * 静态代理实现类,被代理的目标对象 * @author Hust * @Time 2011-11-5 */ public class RealSubject implements Subject { /** * 示例方法 */ @Override public void doSomeThing() { System.out.println(" in " + RealSubject.class); } }
实现一:静态代理
代理对象ProxySubject类
package com.dev.model.proxy.staticProxy; /** * 代理对象 * @author Hust * @Time 2011-11-5 */ public class ProxySubject implements Subject { private Subject real = null; //持有被代理的具体的目标对象 public ProxySubject(Subject sub){//构造方法传入被代理的目标对象 real = sub; } @Override public void doSomeThing() { //可以在这里加些权限或者其它数据完整性的判断,如果通过则继续 before(); //有点像前置通知 if(null != real) real.doSomeThing(); end(); //有点像后置通知 } public void before(){ System.out.println("in" +ProxySubject.class+" before() "); } public void end(){ System.out.println("in" +ProxySubject.class+" end() "); } }
测试TestStaticProxy类
package com.dev.model.proxy.staticProxy; /** * 测试 * @author Hust * @Time 2011-11-5 */ public class TestStaticProxy { public static void main(String[] args) { RealSubject rs = new RealSubject(); ProxySubject ps = new ProxySubject(rs); ps.doSomeThing(); /*** 调用 结果 inclass com.dev.model.proxy.staticProxy.ProxySubject before() in class com.dev.model.proxy.staticProxy.RealSubject inclass com.dev.model.proxy.staticProxy.ProxySubject end() */ } }
实现二:JDK动态代理
DynamicProxy类
package com.dev.model.proxy.javaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import com.dev.model.proxy.staticProxy.RealSubject; import com.dev.model.proxy.staticProxy.Subject; /** * java动态代理 * @author Hust * @Time 2011-11-6 */ public class DynamicProxy implements InvocationHandler { private Subject sb = null; public DynamicProxy(Subject sb){ this.sb = sb; } public Subject getProxyInterface(RealSubject rs){ //设置被代理对象,方便invoke操作 this.sb = rs ; //将真正的订单对象和动态关联起来 Subject sub = (Subject)Proxy.newProxyInstance( RealSubject.class.getClassLoader(), RealSubject.class.getInterfaces(), this); return sub; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //if(method.getName().startsWith("")) return method.invoke(sb, args); } }
测试:DynamicTest
package com.dev.model.proxy.javaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import com.dev.model.proxy.staticProxy.RealSubject; import com.dev.model.proxy.staticProxy.Subject; /** * 测试 * 代理模式:控制对象访问 * @author Hust * @Time 2011-11-6 */ public class DynamicTest { public static void main(String[] args) { //testProxy1(); testProxy2(); } public static void testProxy2(){ RealSubject rs = new RealSubject(); DynamicProxy dp = new DynamicProxy(rs); Subject sb = dp.getProxyInterface(rs); sb.doSomeThing();// in class com.dev.model.proxy.staticProxy.RealSubject } public static void testProxy1(){ RealSubject rs = new RealSubject(); InvocationHandler ich = new DynamicProxy(rs); Subject sub = (Subject)Proxy.newProxyInstance(ich.getClass().getClassLoader(), rs.getClass().getInterfaces(), ich); sub.doSomeThing();// in class com.dev.model.proxy.staticProxy.RealSubject } }