代理模式(面试版)
一、面试常考点
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: 请求缓存代理、鉴权代理、日志埋点代理、懒加载代理。