代理模式: 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对 某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及 进行消息被委托类执行后的后续处理。为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访 问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对 象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策 略预留了空间,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙 的方式近乎完美地实践了代理模式的设计理念。 Java 动态代理机制的出现,使得Java 开发人员不用手工编写代理类,只要 简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所 有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可 以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。 代理模式一般涉及到的角色有 抽象角色:声明真实对象和代理对象的共同接口 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象 代理又分为静态代理和动态代理: 静态代理类:由程序员创建或者由特定工具自动生成源代码,再对其进行编译。在程序运行之前,代理类的.class文件就已经存在 动态代理类:在程序运行时候,运用反射机制动态创建而成 realSubject
proxy
静态代理与动态代理的区别: 静态代理中:如果接口添加一个新的方法,所有的实现类(真实角色)和代理类都要做这个实现,这就增加了代码的复杂度,而动态代理就可以解决这个问题。 动态代理和静态代理相比较,最大的好处就是接口中声明的所有的方法都被转移到一个集中的方法中去处理,这样在接口中声明的方法比较多的情况下我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。 静态代理的最大缺点:当接口增加的一个方法,所有的实现类和代理类都得增加该方法的实现,从而提高了代码的复杂度。 动态代理创建步骤: 1.创建被代理类(真实角色)的接口以及被代理类,实现所有的接口 2.创建一个实现接口InvocationHandler的类DynamicProxy,该类中包含一个“被代理类”类型的成员变量,通过一个带参数的构造方法赋值给他,并且实现其invoke()方法 3.通过Proxy的静态方法Proxy.newInstance(ClassLoaderloader,Class[] interfaces,InvocationHandler handler)创建一个代理Proxy对象proxy(其中interfaces是被代理类所实现的所有接口所对应的Class object数组,handler为DynamicProxy的一个对象)
4.通过proxy调用方法 由Proxy类的静态方法创建的动态代理类具有以下特点: 动态代理类是public、final和非抽象类型的; 动态代理类继承了java.lang.Reflect.Proxy类; 动态代理类的名字以“$Proxy”开头; 动态代理类实现getProxyClass()和newProxyInstance()方法中参数interfaces指定的所有接口。 |