12. 代理模式(Proxy)

问题:想在访问对象时加一层控制(延迟加载、权限校验、缓存等)。

核心:代理对象和目标对象实现同样接口,代理内部控制对目标的访问。

class RealImage {
  constructor(filename) {
    this.filename = filename;
    this.loadFromDisk();
  }
  loadFromDisk() { console.log(`从磁盘加载: ${this.filename}`); }
  display() { console.log(`显示: ${this.filename}`); }
}

class ProxyImage {
  #realImage;
  constructor(filename) { this.filename = filename; }
  display() {
    if (!this.#realImage) {
      this.#realImage = new RealImage(this.filename);
    }
    this.#realImage.display();
  }
}

const img = new ProxyImage('photo.jpg');
img.display(); // 从磁盘加载 → 显示(第一次,触发加载)
img.display(); // 显示(第二次,直接用缓存)
package proxy

import "fmt"

type Image interface {
  Display()
}

type RealImage struct {
  filename string
}

func NewRealImage(filename string) *RealImage {
  img := &RealImage{filename: filename}
  img.loadFromDisk()
  return img
}

func (r *RealImage) loadFromDisk() {
  fmt.Printf("从磁盘加载: %s\n", r.filename)
}

func (r *RealImage) Display() {
  fmt.Printf("显示: %s\n", r.filename)
}

type ProxyImage struct {
  filename  string
  realImage *RealImage
}

func NewProxyImage(filename string) *ProxyImage {
  return &ProxyImage{filename: filename}
}

func (p *ProxyImage) Display() {
  if p.realImage == nil {
    p.realImage = NewRealImage(p.filename)
  }
  p.realImage.Display()
}

ES6 的 Proxy 就是语言级别的代理支持。