赞
踩
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
来一个代理买车的例子
首先要有个买车的抽象类
public interface BuyCar {
public void getCar();
}
真实要买车的对象
public class My implements BuyCar{
@Override
public void getCar() {
System.out.println("我:我购买了一辆车");
}
}
代理,代替真实对象买车的,要持有真实对象的资料,不然就真成自己买车了
public class ProxyMy implements BuyCar{
private BuyCar buyCar; // 一定要持有真实对象
public ProxyMy(BuyCar buyCar) {
this.buyCar = buyCar;
}
@Override
public void getCar() {
System.out.println("代理:我是代购,我帮别人代购一辆车");
buyCar.getCar();
System.out.println("代理:代购完成,车辆已经交给客户");
}
}
来个测试类,测一下
public class Test {
public static void main(String[] args) {
BuyCar my = new My();
BuyCar buyCar = new ProxyMy(my);
buyCar.getCar();
}
}
代理模式,就是在代理类中持有一个真实类(被代理类)的对象,真正被调用的,还是真实类,就像上面,真实买车的,还是我,而实际买车的确实代理人,这样的话,代理人就可以在中间抽点利润什么的,我也免去了一些来回奔跑的麻烦。
动态代理
上面说的是静态代理,在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。spring 的核心功能之一就是 aop,就是动态代理。
Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。
创建动态代理类
public class DynamicProxy implements InvocationHandler {
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理:我是代购,我帮别人代购一辆车");
Object result=method.invoke(obj, args);
System.out.println("代理:代购完成,车辆已经交给客户");
return result;
}
}
测试类:
public class Test {
/* public static void main(String[] args) {
BuyCar my = new My();
BuyCar buyCar = new ProxyMy(my);
buyCar.getCar();
}*/
public static void main(String[] args) {
BuyCar my = new My();
DynamicProxy dynamicProxy = new DynamicProxy(my);
ClassLoader classLoader = my.getClass().getClassLoader();
BuyCar buyCar = (BuyCar) Proxy.newProxyInstance(classLoader, new Class[]{BuyCar.class}, dynamicProxy);
buyCar.getCar();
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。