10.代理模式
代理模式(Proxy Pattern)的主要目的是通过代理对象控制对真实对象的访问,并在访问前后附加额外能力
适合使用代理模式的场景
- 访问真实对象成本高,希望增加缓存或懒加载
- 需要在调用前做权限校验、限流、鉴权等控制
- 希望统一添加日志、监控、熔断等横切能力
- 不希望直接改动真实对象的核心实现
抽象接口与真实对象
interface UserService {
getUser(id: number): Promise<{ id: number; name: string }>;
}
class RealUserService implements UserService {
async getUser(id: number): Promise<{ id: number; name: string }> {
console.log("请求后端接口...");
return { id, name: `user-${id}` };
}
}代理对象
class CacheProxyUserService implements UserService {
private cache = new Map<number, { id: number; name: string }>();
constructor(private target: UserService) {}
async getUser(id: number): Promise<{ id: number; name: string }> {
if (this.cache.has(id)) {
console.log("命中缓存");
return this.cache.get(id)!;
}
const user = await this.target.getUser(id);
this.cache.set(id, user);
return user;
}
}使用示例
async function run() {
const userService = new CacheProxyUserService(new RealUserService());
await userService.getUser(1);
await userService.getUser(1);
}
run();