代理模式的代理就很像是“经纪人”的概念,“使用者”不能直接或接触到“对象”本身,而都需要透过中间的“经纪人(代理)。

代理模式的好处在于:

保护代理:透过代理,可以在实际向‘对象’进行操作前,先进行初步的处理或过滤。

虚拟代理:在满足特定条件下,代理才会实际向‘对象’进行操作。

快取代理:如果传进来的参数和先前的参数相同时,直接返回前一次储存下来的结果。

透过代理模式,我们可以在不影响原本对象功能的情况下,增添其他的功能:

例如,loadImg 方法只负责将图片挂入 DOM 中,如果需要添加图片载入中的 Preload 功能时,则可以额外撰写 proxyLoadImg 的方法,在 proxyLoadImg 方法中,增加这个‘显示图片载入中’的功能。如此将不会动到原本 loadImg 的功能(把图片挂入 DOM 中),又可以添加‘显示图片载入中’的功能。

让代理的界面与本体的界面保持相同:

当我们让代理的界面(interface)和对象本体的界面保持相同有一个很大的好处,从使用者的角度来说,使用者在呼叫代理或呼叫本体是没有差别的,也就是使用者可以用相同的 API 来呼叫代理或呼叫本体,未来如果想要把代理移除并不需要做太多的修正,因为呼叫的 API 是相同的。

这么做的好处在于,使用者可以无痛地在呼叫代理或呼叫本体间切换,端看他当时需要的结果是什么。

常见的例子​

proxy 常见的例子很多,像是 debounce 或 throttle 都可以被视为是一种虚拟代理的例子,呼叫 proxyMethod 和呼叫原本 method 的 interface 一样,但在 proxy 中添加了一些行为。

虚拟代理​

* 快取代理:如果传进来的参数和先前的参数相同时,直接返回前一次储存下来的结果。