理解设计模式(十三)——代理模式

代理模式

提出问题

如果大家知道怎么科学上网的话,应该就对代理有一定的了解。所谓的代理就是,一件事情,我不亲自去做,因为我亲自做做不了,而是找一个人帮我做,这个人就是我的代理。

比如说A和C关系不好,A要跟C说一些事情,碍于情面不方便直接说。这时候,A可以委托B作为他的代理,让B去和C说,再把结果告诉A。这就是(正向)代理。

有正向代理就有反向代理。感兴趣可以自行了解。

那么,在写代码的过程中,我们为什么需要代理?要调用一个对象直接调用就行了,非得要再通过另一个对象再去调用干嘛?

其实在项目中,代理模式就像是一个中间层(中间件),在真正处理请求之前,要先做一些预处理。这些预处理可以放在代理对象中进行。

比如请求数据库之前,要先判断当前用户是否有访问数据库的权限。判断权限的部分就可以交给代理对象处理。

解决问题

有了这么一个思想后,写代码其实是很简单直观的。

class RealObject {
request() {
// ...
}
}

class Proxy {
constructor(realObject) {
this.realObject = realObject;
}
beforeRequest() {
// ...
}
afterRequest() {
// ...
}
request() {
beforeRequest();
this.realObject.request();
afterRequest();
}
}

let real = new RealObject();
let proxy = new Proxy(real);
proxy.request();

后记

除了解决上面说的权限验证的问题外,代理还有其他的一些用途:

  1. 虚拟代理:真实对象响应时间较长,创建一个虚拟代理先响应,等到真实对象响应了再发送真实的响应。

  2. 缓存代理:将请求缓存下来,之后如果再有请求,就不需要向真实对象请求了,直接从缓存代理中返回结果。不过要注意缓存过期的问题。

Author: LeoB_O
Link: https://leob-o.github.io/2019/06/10/ProxyPattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.