概述
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
简要说明
简而言之我们在无法直接调用某个对象的时候,我们就可以通过它的代理对象进行访问。代理模式分为静态代理和动态代理,静态代理是代理对象和真实对象实现了同一个接口,代理对象里有真实对象的一个引用,我们在需要调用一个方法的时候是通过调用代理对象的方法,而不是直接调用真实对象的实现方法,在我们调用的代理对象的方法里通过引用调用了真实对象的实现方法。动态代理在程序运行时,运用反射机制动态创建而成。
对比
动态代理与静态代理对比:
每一个代理类只能为一个接口服务,一个AccountProxy 类实现了一个Account接口,那么我要是有多个接口,是不是要写多个Proxy类与之对应。这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那就引入了我们的动态代理了。
关系图
举例说明
public interface IAcount{
void printAccount();
}
//实际类
public class RealAccount implements IAccount{
@Override
public void printAccount(){
//......
}
}
1.静态代理举例
//静态代理类
public class ProxyAccount implements IAccount{
private IAccount realAccount;
@Override
public void printAccount(){
realAccount.printAccount();
}
}
2.动态代理
//动态代理对象需要继承InvocationHandler接口
public class DynamicProxyObject implements InvocationHandler{
private Object proxy;
public DynamicProcyObject(Object proxy){
this.proxy = proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args){
Object result = null;
//在转调具体目标对象之前,可以执行一些功能处理
if (args != null && args.length > 0) {
for (Object obj : args) {
System.out.print(obj + "---");
}
}
//转调具体目标对象的方法
result = method.invoke(this.proxy, args);
return result;
}
}
public class Test{
public static void main(String[] args){
IAccount proxy =(IAccount)Proxy.newProxyInstance(RealAccount.class.getClassLLoader(),
RealObject.class.getInterfaces(),
new DynamicProxyObject(new RealAccount()));
proxy.printAccount();
}
}