再一次,javascript设计模式与开发实践-代理模式

简述

为一个对象提供一个代用品或者占位符,以便控制对它的访问。

生活中可以找到很多代理模式的场景,例如经纪人、秘书、售票员等。

使用场景

  • 懒加载
  • 缓存
  • ..

案例

图片懒加载是一个很典型的代理模式的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var myImg = (function () {
    var imgNode = new Image();

    document.body.appendChild(imgNode);

    return {
        setSrc: function (src) {
            imgNode.src = src;
        }
    };
})();

var proxyImage = (function () {
    var img = new Image();

    img.onload = function () {
        myImg.setSrc(this.src);
    };

    return {
        setSrc: function (src) {
            myImg.setSrc('loading.png');
            img.src = src;
        }
    };
})();

proxyImage.setSrc('demo.png');

这段繁琐的懒加载实现的意义在于符合单一职责原则开放-封闭原则
给img设置节点和懒加载这两个功能被隔离在两个对象里,它们可以各自变化而不影响对方,即使哪一天不需要代理了,也不会有太大的修改成本。