一、常见的概念:
1.代理模式(Proxy):为其他对象设置一个代理来控制对这个对象的访问;
2.代理模式分为:静态代理模式、动态代理模式
二、分类:
1.静态代理模式:为目标对象创建一个代理对象,在编译的时候产生代理对象,通过访问代理对象来控制目标对象,实现目标对象的某些方法。场景:登录登出,通过访问代理对象来计算登录的时间和登出的时间;
登录的接口:
package com.dbzhang.proxy; /** * 目标对象和代理对象都要实现的接口 * @author Administrator * */ public interface ILogin { public void login(); public void logout(); }
目标对象实现类:
package com.dbzhang.proxy; /** * 目标对象实现登录登出接口 * @author Administrator * */ public class Target implements ILogin { @Override public void login() { try { Thread.sleep(6000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("登录系统"); } @Override public void logout() { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("退出系统"); } }
代理对象实现类:主要是想通过代理对象实现访问目标对象中登录和登出的时间的统计:
package com.dbzhang.proxy; /** * 代理对象要实现登录登出接口 * @author Administrator * */ public class Proxy01 implements ILogin { //目标对象 private Target target; public Proxy01(Target target) { super(); this.target = target; } @Override public void login() { long begin = System.currentTimeMillis();//开始时间 target.login(); long end = System.currentTimeMillis();//结束时间 System.out.println("登录时间为"+(end-begin)+"毫秒"); } @Override public void logout() { long begin = System.currentTimeMillis();//开始时间 target.logout(); long end = System.currentTimeMillis();//结束时间 System.out.println("退出的时间"+(end-begin)+"毫秒"); } }
2.动态代理机制:通过反射机制,利用jdk提供的Proxy对象,在程序运行的时候在内存中根据目标来创建代理对象。
package com.dbzhang.proxy; /** * 代理对象需要实现InvocationHandler接口,调用处理器中的invoke()方法会自动执行 */ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class JdkProxy implements InvocationHandler { //目标对象,通过反射机制获得 private Target target; public JdkProxy(Target target) { super(); this.target = target; } /** * proxy:代理对象的引用 * method:目标对象的目标方法 * args:目标对象的目标方法执行时的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //开始时间 long begin = System.currentTimeMillis(); //执行目标对象的方法 Object object = method.invoke(target, args); long end = System.currentTimeMillis(); System.out.println("登录时间为"+(end-begin)+"毫秒"); return object; } }