代理模式通过创建一个代理对象来代替真实的对象,在客户端看来代理对象和真实对象并没有两样。实际的工作还是通过代理对象传到真实对象中。
但是这里说完全一样也不尽然,我们可以使用代理对象在真实对象的某个方法上加强些功能,但是主要的核心功能还是由真实对象来提供的。
代理模式可以分成如下几种:
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();
}
}
Contents
  1. 1. 静态代理
  2. 2. 动态代理