代理模式是一种应用非常广泛的设计模式。其本质就是“当调用一个Java对象的时候,并不是调用其对象本身,而是调用他的代理”。代理模式的好处嘛,如下:1当需要调用的对象会带来很大的系统开销时,代理对象可以对他进行延迟加载(也就是说代理对象并未完整的或压根就没有创建需要调用的对象),从而当真正需要用到这个对象的时候才去加载它,提高系统的性能。2当目标对象的功能不足的时候,创建代理对象可以增强原对象的功能。这是所谓的动态代理。从另一个角度说,动态代理就是需要调用某些方法,不需要硬编码的创建拥有该方法的对象,而是用代理的方式完成。
代码解释如下,为了简单起见,代码写的尽量简洁,以体现结构:
首先定义一个接口:
package test;
public interface IA//创建一个接口IA
{
void method();
}
package test;
public class A implements IA
{
public A()//A的构造函数
{
try
{
Thread.sleep(3000);//现在假设创建A的对象是一件耗费时间的过程
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
@Override
public void method()
{
System.out.println("执行A的方法");
}
}
定义A的代理ProxyA:
package test;
public class ProxyA implements IA//创建A的代理
{
private IA ia;//代理对象中包含IA对象
public ProxyA(IA ia)
{
ia=this.ia;
}
@Override
public void method()
{
if(ia == null)
{
ia =new A();//此时才真正创建A的对象
}
ia.method();//此时才真正调用A的方法
}
}
测试一下:
package test;
public class Test
{
public static void main(String[] args)
{
long start =System.currentTimeMillis();
IA pa=new ProxyA(null);//创建A的代理,注意,此时A并未被真正的创建
long mid=System.currentTimeMillis();
System.out.println("创建代理对象所花的时间:"+(mid-start));
pa.method();//调用pa的方法,也就是调用A对象的方法,此时A对象才被创建出来
long end=System.currentTimeMillis();
System.out.println("创建真正需要调用的对象所花的时间:"+(end-mid));
}
}
上面的代码的输出是:
创建代理对象所花的时间:2
执行A的方法
创建真正需要调用的对象所花的时间:3007
也就是说创建A的代理的时间很短,而创建A的时间很长,使用代理模式,可以先创建这个对象的代理,而真正要用到这个对象的时候才去创建他,节省了系统的开销。