代理模式
代理模式 , 即在某些时刻,某些场景下 ,原来的对象不足以应付时候,使用一个代理类来代替该对象
应用场景
a、页面图片懒加载 ,当图片还未完全加载出来的时候 ,用一张临时小图片代替
b、程序加载缓冲 ,用一个GIF代替位置
c、动态代理实现切面编程
JDK动态代理实现 示例 : 具体原理分析请看上文
public static interface IProxy {
public void go();
}
/**
* 被代理类
* @author xubo
*
*/
public static class ProxyIm implements IProxy {
public void go() {
System.out.println("正在运行中");
}
}
/**
* 代理类
* @author xubo
*
*/
public static class MyInvocatonHandler implements InvocationHandler {
private Object object;
public MyInvocatonHandler(Object ob) {
object = ob;
}
@Override
/**被代理类触发调用的时候,proxy会变成生成的代理类对象,而代理类对象中的method就是调用该invoke方法 。*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行前");
// method.invoke(proxy, args); 这里使用proxy ,会死循环
method.invoke(object, args);
System.out.println("执行后");
return null;
}
}
public static void main(String args[]) {
ProxyIm jp = new ProxyIm();
MyInvocatonHandler mh = new MyInvocatonHandler(jp);
IProxy pro = (IProxy) Proxy.newProxyInstance(IProxy.class.getClassLoader(), new Class[] { IProxy.class }, mh);
pro.go();
}
CGLIE动态代理 示例:
/**
* 处理类
* @author xubo
*
*/
public static class TargetIntercept implements MethodInterceptor {
/**
* Object为由CGLib动态生成的代理类实例,Method为上文中实体类所调用的被代理的方法引用,
* Object[]为参数值列表,MethodProxy为生成的代理类对方法的代理引用。
*/
@Override
public Object intercept(Object object, Method method, Object[] params, MethodProxy proxy) throws Throwable {
System.out.println("调用前");
Object result = proxy.invokeSuper(object, params);
System.out.println("调用后");
return result;
}
}
/**
* 实体类
*/
public static class ServiceBean {
public void go() {
System.out.println("正在运行中");
}
}
/**
* 使用Enhancer进行植入
* @param args
*/
public static void main(String args[]) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ServiceBean.class);
enhancer.setCallback(new TargetIntercept());
ServiceBean sb = (ServiceBean) enhancer.create(); //这里进行代理类字节码生成
sb.go();
}