12. 代理模式(Proxy)
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就是语言级别的代理支持。