代理模式
代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。
何为提供一个替身或占位符?即一个对象代表另一个对象。有什么事直接告诉代理对象,不必麻烦真正的对象,由代理对象来决定哪些事情去交给真正的对象。举个例子,以前男女婚配,由男方家庭去拜托媒人,媒人转告女方,此时媒人就是代理对象,真正对象时女方。媒人此时就控制了对真正对象的访问。代理模式有许多变体,这些变体都与“控制访问”的做法有关。如
- 远程代理控制访问远程对象。
- 虚拟代理控制访问创建开销大的资源。
- 保护代理基于权限控制对资源的访问。
代理模式类图
远程代理
远程代理适用于需要与远程端,即不在同一个jvm环境下的对象交互。要实现远程代理,步骤有点复杂。
其中,jdk5以后是可以跳过步骤三的,步骤三的功能已经交给动态代理去实现。其中,远程类的实现结构
注册相关代码与启动注册
客户端连接的相关代码
虚拟代理
书中举例创建一个cd封面,封面图片由下载网络上的图片得来,此封面创建过程开销非常大,于是采用代理模式让代理展示出“正在加载”这句话,等真正创建好图片对象的时候,再显示出图片。代理对象拥有被代理的对象的引用。
保护代理(动态代理)
保护代理可以用来对被代理对象划分权限,决定被代理对象有哪些方法可以调用,哪些不可以。
类图如下
其中,proxy是jdk给的,我们添加的代码只能在InvocationHandler中。你划分了多少种不同的权限,就需要创建多少种InvocationHandler。实现保护代理需要经过以下几个步骤
- 创建InvocationHandler。决定权限的关键代码
- 创建Proxy类并实例化Proxy对象