代理模式通过创建一个代理对象来代替真实的对象,在客户端看来代理对象和真实对象并没有两样。实际的工作还是通过代理对象传到真实对象中。
但是这里说完全一样也不尽然,我们可以使用代理对象在真实对象的某个方法上加强些功能,但是主要的核心功能还是由真实对象来提供的。
代理模式可以分成如下几种:
1.虚代理:根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建。
2.远程代理:用来在不同的地址空间上代表同一个对象。
3.保护代理:控制对原始对象的访问。
4.智能指引:在访问对象时执行一些附加操作,比如对指向实际对象的引用计数,第一次引用一个持久对象时,将它装入内存等。
静态代理
public interface Subject { public void request(); }
|
public class RealSubject implements Subject{ @Override public void request() { System.out.println("This is from RealSubject"); } }
|
public class SubjectProxy implements Subject{ private Subject realSubject = null; public SubjectProxy(Subject realSubject) { this.realSubject = realSubject; } @Override public void request() { this.doBeforeRequest(); if(realSubject != null) { realSubject.request(); } this.doAfterRequest(); } private void doBeforeRequest() { System.out.println("This is from doBefore Request"); } private void doAfterRequest() { System.out.println("This is from doAfter Request"); } }
|
public class Client { public static void main(String args[]) { Subject realSubject = new RealSubject(); Subject subject = new SubjectProxy(realSubject); subject.request(); } }
|
动态代理
上面讲的是静态代理,接下来要看到的将是动态代理,动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理的对象。
public interface Subject { public void doSomething(); }
|
public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("This is from RealSubject"); } }
|
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class DynamicProxy <T> { public static <T> T newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) { return (T) Proxy.newProxyInstance(loader, interfaces, h); } }
|
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHanlder implements InvocationHandler { private Object proxy = null; public MyInvocationHanlder(Object proxy) { this.proxy = proxy; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(this.proxy, args); } }
|
public class Client { public static void main(String args[]) { Subject realsubject = new RealSubject(); MyInvocationHanlder handler = new MyInvocationHanlder(realsubject); Subject subject = DynamicProxy.newProxyInstance(realsubject.getClass().getClassLoader(), realsubject.getClass().getInterfaces(),handler); subject.doSomething(); } }
|