代理模式
Posted xiaoxli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。
代理模式:
为一个对象提供一个替身以控制访问这个对象。本质:控制对被代理对象的访问。
代理模式在现实生活中很常见,例如:明星与经纪人,房东与房屋中介等。
- RealSubject是被代理的对象,即真正做事的对象(明星本人)。Proxy:代理对象,即与外界进行沟通的对象(经纪人)。
- RealSubject与Proxy实现了同一个接口,以便任何客户都可以像处理RealSubject对象一样处理Proxy对象,即需要使用RealSubject对象的地方,都可以用Proxy对象代替。
- Proxy持有RealSubject的引用,必要时可以将请求转发给RealSubject。
- RealSubject对象的创建通常由Proxy负责。
一、虚拟代理:
控制访问实例化开销大得对象。虚拟代理经常是直到我们真正需要一个对象的时候才创建。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。
经常用在网页加载某些较大信息场景中。客户端首次请求加载对象A时,由于对象A比较大,加载过程较长,如果页面一片空白,会给用户不好的体验,这时由代理对象B率先显示“加载中。。。请耐心等待”,然后在代理对象中创建对象A,创建完成后,将加载请求方法转发给对象A,由A处理加载请求。此时对象A已经存在,以后客户端的请求都会由代理对象发送给对象A进行处理,再由代理对象B将处理结果发送给客户端。
二、动态代理:
顾名思义就是代理类是在运行时创建的。利用到java.lang.reflect包中的代理支持。
- 此时的代理行为是由两个类完成的,分别是:Proxy(Java代码提供,不需要我们创建编写),InvocationHandler
- Proxy上的任何方法调用都会传入InvocationHandler类中,由InvocationHandler控制对RealSubject方法的访问。即,响应代理的任何调用。
- 当代理的方法被调用时,代理会把这个方法转发给InvocationHandler,但是这并不是通过调用InvocationHandler的响应方法做到的,而是调用invoke()方法。该方法返回的是method.invoke(realsubject,args),其中method是请求方法,realsubject是被代理对象,args是请求参数。这样InvocationHandler就将请求方法转发给被代理对象了。
- Proxy本身是利用静态的Proxy.newProxyInstance()方法在运行时动态地创建。
以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式代理模式 ( 代理模式结构 | 客户端 | 主题对象 | 被代理对象 | 代理对象 )
设计模式 结构型模式 -- 代理模式(动态代理(CGLIB动态代理)三种代理的对比(静态代理动态代理(JDK代理和CGLIB代理)优缺点使用场景))