目录
what什么是代理模式
Gof定义: 为其他对象提供一种代理以控制对这个对象的访问。别名Surrogate。
HeadFirst定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代变对象,让代表对象控制某对象的访问被代理的对象可以是远程的对象、创建开销大的对象或许安全控制的对象。
why为什么需要代理模式
本文重点讨论一下为什么需要代理模式,我相信每一个用过RPC框架的同学,每一个用过AOP的同学,一定一定对这个模式印象很深,所以,无处不在的代理,为什么要用呢,不用会怎样呢。
先看一下GOF设计模式中对代理动机的描述。
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行 创建和初始化。我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象(如 大型光栅图像)的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免 一次性创建所有开销很大的对象。因为并非所有这些对象在文档中都同时可见,所以也没有 必要同时创建这些对象。 这一限制条件意味着,对于每一个开销很大的对象,应该根据需要进行创建,当一个图 像变为可见时会产生这样的需要。但是在文档中我们用什么来代替这个图像呢?我们又如何 才能隐藏根据需要创建图像这一事实,从而不会使得编辑器的实现复杂化呢?例如,这种优 化不应影响绘制和格式化的代码。 问题的解决方案是使用另一个对象,即图像Proxy,替代那个真正的图像。Proxy可以代 替一个图像对象,并且在需要时负责实例化这个图像对象。
只有当文档编辑器激活图像代理的Draw操作以显示这个图像的时候,图像Proxy才创建真 正的图像。Proxy直接将随后的请求转发给这个图像对象。因此在创建这个图像以后,它必须 有一个指向这个图像的引用。 我们假设图像存储在一个独立的文件中。这样我们可以把文件名作为对实际对象的引用。Proxy还存储了图像的尺寸,即它的长和宽。有了图像尺寸,Proxy无须真正实例化 这个图像就可以响应格式化程序对图像尺寸的请求。
how如何实现代理模式
代理模式的主要角色如下。
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
开源框架经典案例
Dubbo中的代理
我们知道,dubbo远程调用过程中,调用的都是Invoker代理类的方法,以JDK代理为例,我们可以看到其真正发起调用是怎么执行的,先来一张图看下dubbo的调用流程,这里使用网上用的比较多的一张图。
可以看到在Dubbo远程服务的调用过程中,使用Netty与服务提供方进行通信,定义DubboInvoker使用服务通信的客户端发