1、代理模式实现的是对目标对象功能的一种增强,具体有静态代理和动态代理。
2、静态代理
package com.dengfangwen.org;
interface Operator {
void add();
}
class Plus implements Operator {
public void add() {
System.out.println(" do add ");
}
}
public class Proxy implements Operator {
Operator operator;
Proxy(Operator operator) {
this.operator = operator;
}
public void add() {
System.out.println(" do add before ");
operator.add();
System.out.println(" do add after ");
}
public static void main(String[] argc) {
Proxy proxy = new Proxy(new Plus());
proxy.add();
}
}
通过调用proxy的方法间接调用目标对象的同类方法,并可以在目标对象方法前后做一些功能增强处理。
实现上: 目标类和代理类必须实现同一接口,代理类对象持有目标对象的引用,能增强的方法只限于公共接口中的方法。
3、动态代理
动态代理是利用java的反射,动态生成代理对象。
package com.dengfangwen.org;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Operator {
void add();
}
class Plus implements Operator {
public void add() {
System.out.println(" do add ");
}
}
//最大的区别点在于静态代理实现是Operator,动态代理实现的invocation
public class ProxyDynamic implements InvocationHandler {
//这里持有的是可以代表所有类的对象,而不仅仅是Operator对象
//不同接口类对象可以共同适用与这个代理类,因此可以大大减少代理类的数量
private Object object;
public ProxyDynamic(Object object) {
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("enhance add before ");
Object result = method.invoke(object, args);
System.out.println("enhance add before ");
return result;
}
public static void main(String[] argc) {
ProxyDynamic proxy = new ProxyDynamic(new Plus());
Operator operator = (Operator) Proxy.newProxyInstance(Plus.class.getClassLoader(), new Class[]{
Operator.class}, proxy);
operator.add();
}
}
通过对比发现:
上面静态代理和动态代理实现的最大区别在于:
静态代理: 代理类实现的是共同的接口Operator ,持有的是Operator对象,因为只能代理Operator子类对象。
jdk 动态代理: 代理类实现的是 InvocationHandler 接口,并重写 invoke 方法,持有的是Object对象,可以代理所有对象。不同族类的对象可以共用一个代理,可以大大减少代理类的数量。