天天看点

Java代理模式-静态代理和动态代理

静态代理

以租房为示例,不废话上代码

创建租房接口

public interface Rent {
    public void rent();
}      

 

创建房东类

//房东
public class Host implements Rent{

    public void rent() {
        System.out.println("房东要出租房子");
    }
}      

  

创建代理对象

public class Proxy implements Rent{
    private Host host;

    public Proxy() {
    }

    public Proxy(Host host) {
        this.host = host;
    }

    public void rent() {
        seeHouse();
        host.rent();
        hetong();
        fare();
    }

//    看房
    public void seeHouse(){
        System.out.println("中介带你看房");
    }

    //    收中介费
    public void fare(){
        System.out.println("收中介费");
    }

    //    签租赁合同
    public void hetong(){
        System.out.println("签租赁合同");
    }
}      

  

代码测试

public class Client {
    public static void main(String[] args) {
//        房东要租房子
        Host host=new Host();
//        代理,中介帮房东租房子,但是呢?代理角色一般会有一些附属操作!
        Proxy proxy = new Proxy(host);
//        你不用面对房东,直接找中介租房即可!
        proxy.rent();
    }
}      

执行结果

中介带你看房
房东要出租房子
签租赁合同
收中介费
      

 

动态代理

动态代理分为两大类:基于接口的动态代理,基于类的动态代理

需要了解两个类:proxy代理、InvocationHandler调用处理程序

基于接口---JDK原生动态代理

创建租房接口

public interface Rent {
    public void rent();
}      

  

创建房东类

public class Host implements Rent {
    public void rent() {
        System.out.println("房东要出租房子");
    }
}      

  

创建测试类

public class Client {
    public static void main(String[] args) {
        final Rent host = new Host();
        Rent proxy =(Rent) Proxy.newProxyInstance(host.getClass().getClassLoader(), host.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
                System.out.println("中介带你看房");
                Object invoke = method.invoke(host, args);
                System.out.println("签租赁合同");
                return invoke;
            }
        });
        proxy.rent();
    }
}      

执行结果

中介带你看房
房东要出租房子
签租赁合同
      

说明一下Proxy对象的newProxyInstance方法

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)      
  • ClassLoader loader,

    :指定当前目标对象使用类加载器,获取加载器的方法是固定的
  • Class<?>[] interfaces,

    :目标对象实现的接口的类型,使用泛型方式确认类型
  • InvocationHandler h

    :事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入

还有其中 InvocationHandler 接口的 invok 方法

public Object invoke(Object proxy, Method method, Object[] args)      
  • Cproxy,

    :就是代理对象,newProxyInstance方法的返回对象

继续阅读