定义:为其他对象提供一种代理 以控制这个对象的访问。
静态代理: 在代码运行前就已经存在了代理类的class编译文件,代理只能代理某一类,不能代理多个类
动态代理:在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。也就是我们在编码阶段不需要知道代理谁,代理谁我们将会在代码运行时决定,一个代理可以代理多种 目标对象,对目标对象的方法进行增强
代理模式使用场景
无法或者不想直接访问某个对象时可以通过一个代理对象来间接的访问。
静态代理的实现
1.编写具体要代理的动作
public interface RentHouse {
void rent();
}
2.编写具体对象
public class IRentHouse implements RentHouse{
@Override
public void rent() {
System.out.println("我自己租房子");
}
}
3.编写代理对象
public class Agency implements RentHouse{
RentHouse rentHouse ;
public void setRentHouse(RentHouse rentHouse) {
this.rentHouse = rentHouse;
}
@Override
public void rent() {
System.out.println("找中介租房子");
rentHouse.rent();
System.out.println("中介租房子");
}
}
4.客户端调用
RentHouse rentHouse = new IRentHouse();
Agency agency = new Agency();
agency.setRentHouse(rentHouse);
agency.rent();
动态代理的实现 (反射)
1.创建具体动作
public interface RentHouse {
void rent();
}
2.创建动态代理类
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理开始");
return method.invoke(object,args);
}
}
3.使用
RentHouse rentHouse = new IRentHouse();
DynamicProxy dynamicProxy = new DynamicProxy(rentHouse);
ClassLoader classLoader = rentHouse.getClass().getClassLoader();
RentHouse iRentHouse = (RentHouse) Proxy.newProxyInstance(classLoader, new Class[]{RentHouse.class}, dynamicProxy);
iRentHouse.rent();