代理模式

1、代理模式

代理模式:为其他对象提供一种代理以控制这个对象的访问。

分析:

  • 抽象角色:一般使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:可以代理真实角色,拥有真实角色的方法
  • 客户:访问代理角色

代理模式

1.1 静态代理模式

静态代理是由程序或特定工具自动生成的源代码,在程序运行时,.class文件就已经存在了。

静态代理的好处:

  • 使真实角色的操作更加纯粹,代码不用动,不用去关注一些公共业务
  • 公共业务交给代理角色!实现业务的分工
  • 公共业务扩展也是再代理角色中实现,方便集中管理

真实角色类:

public interface Renti { 
    void rent();
}
public class Rent implements Renti{
    public void rent() {
        System.out.println("buy house!----真实对象");
    }
}

代理角色类:

public class RentProxy implements Renti{
    private Rent rent;

    public RentProxy(Rent rent) {
        this.rent = rent;
    }

    public void rent() {
        System.out.println("fiex!-----代理对象");
        rent.rent();
    }
}

测试类(客户):

//静态代理模式:
@Test
public static void main(String[] args) {
    Rent rent = new Rent();
    RentProxy rentproxy = new RentProxy(rent);
    rentproxy.rent();
}

1.2 动态代理模式

动态代理指在运行时自动生成的代理类。

动态代理的好处:

  • 使真实角色的操作更加纯粹,代码不用动,不用去关注一些公共业务
  • 公共业务交给代理角色!实现业务的分工
  • 公共业务扩展也是再代理角色中实现,方便集中管理
  • 一个动态代理类代理一个接口,一般是对应的一类业务
  • 一个动态代理类可以代理多个类,只要是实现同一个接口就可以

动态代理需要实现InvocationHandler接口的invoke方法:

  • 创建方法,必须调用Proxy类的静态方法newProxyInstance,该方法如下:

    Object Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException

    • loder:表示类加载器,通过getClassLoader()获取
    • interfaces:表示需要代理的类的接口,通过getInterfaces获取
    • handler:表示调用处理器,实现了InvocationHandler接口的对象
  • 最后,在重载的invoke方法中,使用method.invoke()方法传参

实体类:

public interface Rent {
    void rent();
}
public class RentRel implements Rent{
    public void rent() {
        System.out.println("buy house!---真实主体!");
    }
}

代理类:

public class Proxydy implements InvocationHandler {
    //被代理的接口。
    private Object object = null;

    //生成得到的代理类。
    public Object newReal(Object real){
        this.object = real;
        Class<?> realClass = real.getClass();
        Object proxyInstance = 				Proxy.newProxyInstance(realClass.getClassLoader(),realClass.getInterfaces(),this);	
        return proxyInstance;
    }

    //处理代理实例,并返回结果。
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("进入代理!!!!");
        //本质:使用反射机制实现动态代理。
        Object invoke = method.invoke(object, args);
        return invoke;
    }
}

测设类:

//动态代理模式:
public static void main(String[] args) {
    Rent real = (Rent) new Proxydy().newReal(new RentRel());
    real.rent();
}
上一篇:spring--动态代理


下一篇:『设计模式』结构型 ——代理模式