设计模式之--代理模式(动态代理)

JDK 提供的动态代理的两个相关的类:InvocationHandler 和 Proxy

一:Proxy
  Proxy 提供了一个获取实例的静态方法
  public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
  1 ClassLoader loader 目标对象类加载器(包含目标对象的属性、行为),
  2 Class<?>[] interfaces 目标对象包含的所有接口
  -------------------------1、2 这两个参数可以生成代理对象  
  3 InvocationHandler h 使用目标对象方法时,触发调用控制器中的invoke方法,做特殊业务处理
  代理过程:根据目标对象的类加载器和所有接口生成代理对象,代理对象将目标对象的所有方法实现转移到InvocationHandler中的invoke中,
  以便做业务逻辑中的特殊处理,AOP 就是这样实现的

二:InvocationHandler 
  InvocationHandler 接口只提供了一个接口方法
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  1 Object proxy  目标对象  
  2 Method method 动态代理对象的方法  
  3 Object[] args 动态代理对象的方法参数
  在invoke中调用目标对象的指定方法,并进行差异化业务处理

三:接口
  

package dmode.proxy;

/** 
 * 类描述:  接口
 * @version 1.0  CreateDate: 2015-2-13
 */
public interface Subject {
    
    /**
     * 方法描述:上班打卡
     */
    public void punchCard(String name,String company);
}

 

四:实现类

package dmode.proxy;

/** 
 * 类描述:  员工
 * @version 1.0  CreateDate: 2015-2-13
 */
public class Employer implements Subject{

    @Override
    public void punchCard(String name,String company) {
        System.out.println(name + "上班打卡.......公司:" + company);
    }
}

 

五:动态代理类

package dmode.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/** 
 * 类描述:  动态代理类
 * @version 1.0  CreateDate: 2015-2-13
 */
public class DynamicProxy implements InvocationHandler{
    
    //被代理实例
    Object object = null;
    
    public DynamicProxy(Object _obj){
        this.object = _obj;
    }
    /**
     * JDK 动态代理方法,对被代理类的方法进行代理
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
        //此处可以通过Method 来根据不同的方法做不同特色业务处理,利用反射
     System.out.println("动态代理执行打卡...");
        Object result = method.invoke(this.object, args);
        return result;
    }
    
    /**
     * 方法描述:获取代理对象
     * @param subject
     * @return
     */
    public static Subject getProxy(Subject subject){
        ClassLoader classLoader = subject.getClass().getClassLoader();
        Class<?>[] interfaceArry = subject.getClass().getInterfaces();
        InvocationHandler invoHandler = new DynamicProxy(subject);
        Object object = Proxy.newProxyInstance(classLoader, interfaceArry,invoHandler);
        return (Subject)object;
    }

}

 

六:应用场景

package dmode.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/** 
 * 类描述:  入口
 * @version 1.0  CreateDate: 2015-2-13
 */
public class Acce {
    public static void main(String[] args) {
        Subject emp = new Employer();
        Subject dyProxy = DynamicProxy.getProxy(emp);
        dyProxy.punchCard("zzd","fencer");
        dyProxy.beOnDuty();
        dyProxy.offDuty();
    }
}

 

posted @ 2015-02-15 10:35  roscee  阅读(257)  评论(0编辑  收藏  举报