设计模式之代理模式

来源:互联网 发布:北大青鸟的java课程 编辑:程序博客网 时间:2024/06/15 00:10

设计模式之代理模式

1、什么是代理模式:

代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。

就是一个接口由两个类来实现,一个是真实角色,一个是代理角色。

代理可以提供延迟实例化(lazy instantiation),控制访问, 等等。

2、代理模式中的角色:

抽象角色:声明的共同接口或者是抽象类。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象能代替真实对象。同时,代理对象可以附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

3、什么时候使用代理模式:

当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。

一个对象,比如一幅很大的图像,需要载入的时间很长。    

一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果

一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。

一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限

4、代理模式的分类:

1、静态代理:

 

主要实现思路:

1) 两个类都实现一个公共的接口。真实角色实现接口,重写方法;

2) 代理类与真实角色的区别是:在代理类中创建一个私有的真实角色的对象,并写有参构造。也就是说:

首先代理类持有真实角色的一个引用。

然后在重写接口的方法的时候,用真实角色的引用调用真实角色的实现方法。

 

2、动态代理:

主要作用:借助于JVM的支持,可以在运行时动态生成代理类(“代理角色”),就可以解决代理模式中代码膨胀的问题,使用了动态代理后,“代理角色”将不用手动生成,而由JVM在运行时,通过指定类加载器、接口数组、调用处理程序这3个参数来动态生成。

从JDK1.3开始,java中引入了动态代理机制。

相关的接口或类有如下两个:InvocationHandler和Proxy,都位于java.lang.reflect包下。
InvocationHandler接口只定义了一个抽象方法:
        Object invoke(Object proxy, Method method, Object[] args) 
Proxy类中主要的2个静态方法:
        Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) 返回一个动态创建的代理类(Class)
        Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)返回一个改代理类的一个实例(Object)

参数:

Loader:代理类的classloader;

Interface:代理类实现的接口列表:

H:调用处理器,就是从下面说的中介类;

注意:上述方法进行创建对象后,当执行该代理对象调用方法的时候,jvm会动态指派“调用处理器”,向外层invoke传递参数,并调用method.invoke()执行;

 

中介类:(调用处理器)

在真实角色和代理角色之间有一个中介类,需要

① 实现invocationhandler接口,这个中介类叫做“调用处理器”,拦截对代理类方法的调用。该接口只有一个invoke()方法,里面有三个参数,

分别是:

proxy参数是代理类对象,

method是具体调用的代理类的那个方法,

args是这个方法的参数。

② 私有化真实角色----有参构造

真实角色、中介类关系:

真实角色

真实类

中介类

代理类

 

中介类、代理角色关系:

中介类

真实类

代理角色

代理类

 

总结:动态代理就是两个静态代理关系组成。

 

 

 

0 0
原创粉丝点击