代理模式算是我们平时项目中接触的比较多的一种模式,最常见的包括:Spring AOP,RPC框架,Mybatis中插件实现方式,JDK中Proxy类。下面从最简单的概念开始一起来学习一下代理模式。
什么是代理模式
《设计模式》这本书上是这么说的:为其他对象提供一种代理以控制对这个对象的访问。这句话听起来看起来都很抽象,不过记住就好了。慢慢的根据例子来理解这种模式出现的意图是什么、想解决什么样的问题。
书上对于代理模式举了这样一个例子:一份文档中,如果包含了一个比较大的图片,而我们又不想每次打开文档时都把图片加载出来,这个时候需要一个简单的图标来表示我们的图片,只有在我们点击这个图标时,才会从磁盘中将图片加载出来。这个图标就是这个图片的代理(或者是一个链接)。
代理模式又根据实际用途分了几类,有助于我们在分析问题时合理的使用,方便我们在学习时更结构化的理解。
- 远程代理(Remote Proxy):为一个对象在不同地址空间提供局部代表,RPC框架。
- 虚代理(Virtual Proxy):根据需要创建开销很大的对象。
- 保护代理(Protection Proxy):控制对原始对象的访问。
- 智能索引(Smart Reference):取代了简单的指针,它在访问对象时执行了一些附加操作。
代理模式的结构
代理类中持有真实类中的一个引用,当用户访问代理类时,代理类会调用真实类中响应的方法。当然这期间可以加很多代理类自己的逻辑。