代理模式
代理模式是在原本类在调用时不方便,比如:占用内存,数据不安全等所有使用一个代理类去代理这个原本类来执行。
代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务
比如:车站售票处的代理售票点,系统的快捷方式。
实现方法
静态代理
实现同一个接口,在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。
静态代理优点:操作简单,使用方便。
缺点:只能代理一个类,有很大局限性。
动态代理
有接口时用JDK的方式实现:通过Proxy类实现
实现步骤
//接口
public interface Dao {
public int add(int a,int b);
public String name(String name);
}
//Dao接口实现类即被代理类
public class DaoImp implements Dao {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String name(String name) {
return name;
}
}
-
编写Hanlder类实现InvocationHandler接口
public class Handler implements InvocationHandler{ private DaoImp daoImp;//通过有参构造方法把被代理类传递过来 public Hanlder(DaoImp daoImp){ this.daoImp=daoImp; } //在invoke方法里实现增强代码 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法执行前"+method.getName()+ Arrays.toString(args)); Object res= method.invoke(daoImp,args); System.out.println("执行方法"+res); System.out.println("方法执行后"); return null; } }
-
调用代理类
public class DaoProxy{ public static void main(String[] args) { DaoImp daoImp = new DaoImp(); Class[] interfaces = {Dao.class}; Dao dao = (Dao) Proxy.newProxyInstance(DaoProxy1.class.getClassLoader(),interfaces,new Handler(daoImp)); dao.name("刘"); } }
其中newProxyInstance的三个参数分别是:
第一个是:类加载器来定义代理类
第二个是:代理类实现的接口列表
第三个是:该代理实例的调用处理程序
没有接口时 :没有接口时,使用CGLIB动态代理。