一、什么是代理模式?
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。如,在项目推进过程中,要求在原先完成的代码基础上添加日志,确不能改变代码原有逻辑,那么代理模式是很好的选择。代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。
二、静态代理以及其使用
静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在Java中线程的设计就使用了静态代理设计模式,其中自定义线程类实现Runable接口,Thread类也实现了Runalbe接口,在创建子线程的时候,传入了自定义线程类的引用,再通过调用start()方法,调用自定义线程对象的run()方法。实现了线程的并发执行。
如上所示,代理类和被代理对象实现了相同的接口,代理类关联实体类,并将该实体类set(构造函数存入)到代理类,并且在代理类加入了前置和后置操作。
三、动态代理的使用
动态代理利用反射机制在运行时创建代理类。接口、被代理类不变,我们构建一个handler类来实现InvocationHandler接口。
public class ProxyInvocationHandleimplements InvocationHandler {
private Hosthost;
private Rentrent;
public void setRent(Rent rent) {
this.rent = rent;
}
public ObjectgetProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(),this);
}
public void see(){
System.out.println("看房");
}
public Objectinvoke(Object proxy, Method method, Object[] args)throws Throwable {
see();
System.out.println("开始看房");
method.invoke(rent, args);
System.out.println("结束");
return null;
}
}