代理模式是一种使用非常广泛的设计模式。在spring中的AOP,dubbo等框架中都有他的身影。
它的简单结构如下:
下面是静态代理模式的简单实现。
接口:
public interface TalkService {
void speakChinese();
}
//委托类
public class RealSubject implements TalkService {
@Override
public void speakChinese() {
System.out.println("你好!");
}
}
//代理类
public class Proxy implements TalkService {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void speakChinese() {
System.out.println("begin");
realSubject.speakChinese();
System.out.println("end");
}
}
下面是测试类:
//Test
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Proxy p = new Proxy(realSubject);
p.speakChinese();
}
}
以上就是静态代理模式的实现,动态代理是为了能够动态的代理各个委托类,不需要为每个委托类都设计一个代理类。动态代理的关键点
就是反射的应用。通过传入的目标委托类名称,动态反射出该目标类的对象,关键代码如下。
public class MyInvokeHandler implements InvocationHandler {
private Object target;
public MyInvokeHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object result = method.invoke(target,args);
System.out.println("end");
return result;
}
public Object getProxy() {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class<?>[] interfaces = target.getClass().getInterfaces();
return Proxy.newProxyInstance(loader, interfaces, this);
}
}