代理模式

代理模式:

  为一个对象提供一个替身以控制访问这个对象。本质:控制对被代理对象的访问。

  代理模式在现实生活中很常见,例如:明星与经纪人,房东与房屋中介等。

  1. RealSubject是被代理的对象,即真正做事的对象(明星本人)。Proxy:代理对象,即与外界进行沟通的对象(经纪人)。
  2. RealSubject与Proxy实现了同一个接口,以便任何客户都可以像处理RealSubject对象一样处理Proxy对象,即需要使用RealSubject对象的地方,都可以用Proxy对象代替。
  3. Proxy持有RealSubject的引用,必要时可以将请求转发给RealSubject。
  4. RealSubject对象的创建通常由Proxy负责。

一、虚拟代理:

  控制访问实例化开销大得对象。虚拟代理经常是直到我们真正需要一个对象的时候才创建。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。

  经常用在网页加载某些较大信息场景中。客户端首次请求加载对象A时,由于对象A比较大,加载过程较长,如果页面一片空白,会给用户不好的体验,这时由代理对象B率先显示“加载中。。。请耐心等待”,然后在代理对象中创建对象A,创建完成后,将加载请求方法转发给对象A,由A处理加载请求。此时对象A已经存在,以后客户端的请求都会由代理对象发送给对象A进行处理,再由代理对象B将处理结果发送给客户端。

二、动态代理:

  顾名思义就是代理类是在运行时创建的。利用到java.lang.reflect包中的代理支持。

  1. 此时的代理行为是由两个类完成的,分别是:Proxy(Java代码提供,不需要我们创建编写),InvocationHandler
  2. Proxy上的任何方法调用都会传入InvocationHandler类中,由InvocationHandler控制对RealSubject方法的访问。即,响应代理的任何调用。
  3. 当代理的方法被调用时,代理会把这个方法转发给InvocationHandler,但是这并不是通过调用InvocationHandler的响应方法做到的,而是调用invoke()方法。该方法返回的是method.invoke(realsubject,args),其中method是请求方法,realsubject是被代理对象,args是请求参数。这样InvocationHandler就将请求方法转发给被代理对象了。
  4. Proxy本身是利用静态的Proxy.newProxyInstance()方法在运行时动态地创建。

 

posted @ 2018-08-24 16:19  菠菜汤圆  阅读(123)  评论(0编辑  收藏  举报