代理模式

什么是代理?

  代理就是代替委托方去做一些事情

代理模式:

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

  它的特征是代理类与委托类实现相同的接口,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单来说就是,我们访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,使我们可以附加多种用途。

  Tips:

    委托类:指的是代理模式中的被代理对象
    代理类:指的是生成的代表委托类的一个角色

代理分类:

  静态代理:

    指代理类在编译器就创建好了,并生成 .class文件;不是编译器生成的代理类,而是我们手动创建的类。在编译时就已经将接口、本代理类和代理类确定下来。

    软件设计模式中所指的代理一般就是说的静态代理

  动态代理:

    在程序运行时,动态地为被代理对象生成代理类。动态代理是通过反射生成的。

    在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理

总结:

  静态代理是通过在代码中显式编码定义一个业务实现类的代理类,在代理类中对同名的业务方法进行包装,用户通过代理类调用委托类的业务方法;

  JDK动态代理是通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法;

  CGlib动态代理是通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理;

  静态代理在编译时产生class字节码文件,可以直接使用,效率高。动态代理必须实现InvocationHandler接口,通过invoke调用被委托类接口方法是通过反射方式,比较消耗系统性能,但可以减少代理类的数量,使用更灵活。cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类。

END.

原文地址:https://www.cnblogs.com/yangyongjie/p/14296840.html