代理模式

代理模式

代理模式 ,  即在某些时刻,某些场景下 ,原来的对象不足以应付时候,使用一个代理类来代替该对象


应用场景

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();
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值