1.代理模式定义
代理模式为另外一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
2.代理的分类
1)虚代理
根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建。Hibernate中的懒加载就是用的虚代理。
2)远程代理
远程代理可以作为另一个JVM上对象的本地代表,调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。比如RMI。
3)保护代理
控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问。比如Spring中的AOP。
3.动态代理的实现
在JAVA中,有两种方式来实现动态代理。一种方式是使用Java的API,另外一种方式是使用开源库CGLIB。使用Java API实现的动态代理的前提条件是必须实现接口,即面向接口编程。而CGLIB就没有限制,即可以动态继承java类又可以实现接口。
下面附使用JAVA API测试动态代理的例子:
1)Subject
public interface Person {
public void sayHelloWorld();
}
2)RealSubject
public class Child implements Person {
@Override
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
3)Proxy
public class HelloWorldHandler implements InvocationHandler {
//目标对象
private Object targetObject;
public HelloWorldHandler(Object targetObject){
this.targetObject = targetObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法调用前。。。");
Object result = method.invoke(this.targetObject, args);
System.out.println("方法调用结束");
return result;
}
}
4)Test
public class HelloWorldTest {
public static void main(String[] args) {
Person obj = new Child();
HelloWorldHandler handler = new HelloWorldHandler(obj);
Person proxy = (Person)Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
handler);
proxy.sayHelloWorld();
}
}