Java 动态代理

来源:互联网 发布:单片机 仿真实例 微盘 编辑:程序博客网 时间:2024/06/15 00:57

Interface

public interface 租房 {    void 看房(double money);    void 租房(double money);}

房东

public class 房东 implements 租房{    @Override    public void 看房(double money) {        System.out.println("房东收到的看房费用:" + money);    }    @Override    public void 租房(double money) {        System.out.println("房东收到的租房费用:" + money);    }}

静态代理

总结

  1. 租房 接口协议
  2. 房东遵守 租房 接口协议,并将租房的动作交给 中介 代理
  3. 中介遵守 租房 接口协议,接受房东的中代理
  4. 房客找中介租房,中介持有房东的租房代理权,并从中抽成

中介

public class 中介 implements 租房 {    private 租房 zf;    public 中介(租房 zf) {        this.zf = zf;    }    @Override    public void 看房(double money) {        Double d = money / 2;        System.out.println("中介抽成:" + d);        zf.看房(d);    }    @Override    public void 租房(double money) {        Double d = money / 2;        System.out.println("中介抽成:" + d);        zf.租房(d);    }}

静态代理的房客

public class 房客 {    @Test    public void staticModel(){        租房 房东 = new 房东();        租房 中介 = new 中介(房东);        中介.看房(100);        中介.租房(1000);        /*        中介抽成:50.0        房东收到的看房费用:50.0        中介抽成:500.0        房东收到的租房费用:500.0        */    }}

动态代理

总结

  1. 租房 接口协议
  2. 房东遵守 租房 接口协议
  3. 少去中介的类
  4. 房东使用动态代理模式,将房屋租给房客

动态代理的房客

public class 房客 {    @Test    public void dynamicModel(){        租房 房东 = new 房东();        // Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类        // 参数:        // ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。        // Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。        // InvocationHandler:策略(方案)设计模式的应用。如何代理?        租房 proxy = (租房) Proxy.newProxyInstance(                房东.getClass().getClassLoader(),                房东.getClass().getInterfaces(),                new InvocationHandler() {                    // InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行                    // 参数:                    // Object proxy:代理对象本身的引用。一般用不着。                    // Method method:当前调用的方法。                    // Object[] args:当前方法用到的参数                    @Override                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                        Double d = (Double) args[0] / 2;                        System.out.println("中介抽成:" + d);                        Object invoke = method.invoke(                                房东,                                new Object[]{d}                        );                        System.out.println("后续事情");                        return invoke;                    }                }        );        proxy.租房(50);        proxy.租房(1000);        /*        中介抽成:25.0        房东收到的租房费用:25.0        后续事情        中介抽成:500.0        房东收到的租房费用:500.0        后续事情        */    }}