返回首页

代理模式(面试版)

一、面试常考点

1. 代理模式本质

为目标对象提供“访问控制层”,在访问前后附加逻辑。

2. 常见代理类型

虚拟代理(延迟加载)、缓存代理、保护代理、远程代理。

3. 面试追问点

代理和装饰器区别:代理偏“控制访问”,装饰器偏“扩展职责”。

二、细节介绍

1. 核心思想

在不修改目标对象的前提下,新增权限、缓存、日志、限流等横切能力。

2. 优点

职责分离,目标对象更聚焦,横切逻辑可复用。

3. 代价

调用链变长,排查问题时需关注代理层行为。

三、示例代码

function createRequestProxy(requestFn) {
  const cache = new Map()

  return async function proxy(url) {
    if (cache.has(url)) {
      return cache.get(url)
    }

    const data = await requestFn(url)
    cache.set(url, data)
    return data
  }
}

async function fakeRequest(url) {
  return { url, ts: Date.now() }
}

const request = createRequestProxy(fakeRequest)

request('/api/user').then(console.log)
request('/api/user').then(console.log) // 命中缓存

四、常用应用场景

1. 接口请求缓存

相同参数请求直接复用结果。

2. 权限控制

调用敏感接口前先做角色校验。

3. 懒加载

昂贵对象(大图、图表实例)按需创建。

五、高频追问标准答法(Q/A)

1. Q: 代理和装饰器区别

A: 代理强调访问控制和间接访问;装饰器强调功能增强与职责扩展。

2. Q: 代理层会带来什么问题

A: 调用链更长,排查时需要识别“目标逻辑问题”还是“代理逻辑问题”。

3. Q: 前端最常见代理实践

A: 请求缓存代理、鉴权代理、日志埋点代理、懒加载代理。