码迷,mamicode.com
首页 > 其他好文 > 详细

代理模式

时间:2016-04-10 19:19:37      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

定义:为其他对象提供一种代理以控制对这个对象的访问。代理对象起到中介的作用,可去掉功能服务或增加额外的服务。

推荐用聚合方式实现静态代理
 
所谓动态代理是这样一种class:它是在运行时生成的class,该class需要实现一组interface,使用动态代理时必须实现InvocationHandler接口。
动态代理的实现步骤:1、创建一个实现接口InvocationHandler的类,他必须实现invoke方法(即先写事物处理器,在invoke方法里边添加具体业务逻辑)。2、创建被代理的类以及接口。3、调用Proxy的静态方法,创建一个代理类newProxyInstance(ClassLoader loader,Class[] interface,InvocationHandler h);  4、通过代理调用方法。
例如:
package com.imooc.jdbcproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TimeHandler implements InvocationHandler {
public TimeHandler(Object target) {
super();
this.target=target;
}
private Object target;
/*
* 参数:proxy是被代理的对象
* method:被代理的方法
* arg:方法的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("开始开车时间——————");
long starttime=System.currentTimeMillis();
 
method.invoke(target);
 
System.out.println("开车结束时间-------");
long endtime=System.currentTimeMillis();
System.out.println("开车所用时间。。。。。"+(endtime-starttime)+"毫秒");
return null;
}
}
package com.imooc.jdbcproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.imooc.proxy.Car;
import com.imooc.proxy.moveAble;
/*
* JDK动态代理测试类类
*/
public class Test {
public static void main(String[] args) {
Car car=new Car();
InvocationHandler h=new TimeHandler(car);
Class<?> cls=car.getClass();
/*
* loader;类加载器
* interface:实现接口
* h InvocationHandler:
*/
moveAble m=(moveAble) Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), h);//动态产生了代理对象
m.move();
}
}
 
动态代理的实现思路:
实现功能:通过Proxy的newProxyInstance返回代理对象
1、声明一段源码(动态产生代理),2、编译源码(JDK Compiler API),产生新的类(即代理类)。3、将这个类load到内存中,产生一个新的对象(即代理对象)。4、return 代理对象。

代理模式

标签:

原文地址:http://www.cnblogs.com/yangmei123/p/5374903.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!