说实在的,代理模式这个模式我现在闭着眼睛都能写出来,真的是快要看吐了。
一、先看看代理模式的uml图
图讲的很清楚了,我的例子的subject是moveable类里面有move方法,realsubject是tank,proxysubject是timeTankProxy而已。
二、我个人认为:
静态代理就像是下图那样,你要取名字,建好类名,比如timeTankProxy。
静态代理的代码怎么实现的呢?
package zhangsisi;
public interface Moveable {
void move();
}
package zhangsisi;
public class tank implements Moveable{
@Override
public void move() {
System.out.println("这是坦克自己本身做的move行为!");
}
}
package zhangsisi;
public class timeTankProxy implements Moveable{
private Moveable tank;
public timeTankProxy(Moveable tank) {
super();
this.tank = tank;
}
@Override
public void move() {
System.out.println("这是timeTankProxy做的时间分割开始");
tank.move();
System.out.println("这是timeTankProsy做的时间分割结束");
}
}
在客户端是通过new timetankproxy类来实现move方法,所以有时间分割线。
如果你要是给tank加一个日志事件的话需要建立一个logTankProxy.java。。。总之很麻烦。
而动态代理,我们指定,jdkproxy可以帮助我们自动生成你想要的代理类:
Iuser proxy = (Iuser) Proxy.newProxyInstance(Iuser.class.getClassLoader(), new Class[]{Iuser.class}, h);
我刚开始学proxy类的时候,虽然很好用,但是总是觉得弄不懂原理,后来又觉得弄不懂反射,后来又发现它与aop也有关系,这就有意思了。后来找了很多资料来学习,才刚刚了解一下底层代码是如何实现的。
所以我觉得学习关于proxy的实现原理(下一篇博客)