定义:为其他对象提供一种代理以控制对这个对象的访问

类比:就像你去电影院看电影,你买的是电影票(代理),而不是直接买电影。电影票允许你进入电影院观看电影

应用场景

  • 控制对对象的访问
  • 在访问对象时做一些额外的处理(如权限控制、延迟加载等)

优缺点

  • 优点
    • 控制对象的访问权限
    • 在不修改对象的情况下添加额外的功能
  • 缺点
    • 增加了系统的复杂性
    • 可能影响系统的性能

实现代码

// 服务接口
interface Subject {
  request(): void;
}
 
// 实际服务
class RealSubject implements Subject {
  public request(): void {
    console.log('RealSubject: Handling request.');
  }
}
 
// 代理类
class Proxy implements Subject {
  private realSubject: RealSubject;
 
  constructor(realSubject: RealSubject) {
    this.realSubject = realSubject;
  }
 
  public request(): void {
    if (this.checkAccess()) {
      this.realSubject.request();
      this.logAccess();
    }
  }
 
  private checkAccess(): boolean {
    console.log('Proxy: Checking access prior to firing a real request.');
    return true;
  }
 
  private logAccess(): void {
    console.log('Proxy: Logging the time of request.');
  }
}
 
// 客户端代码
function clientCode(subject: Subject) {
  subject.request();
}
 
console.log('Client: Executing the client code with a real subject:');
const realSubject = new RealSubject();
clientCode(realSubject);
 
console.log('');
 
console.log('Client: Executing the same client code with a proxy:');
const proxy = new Proxy(realSubject);
clientCode(proxy);