JavaScript 设计模式 之 代理模式

日期: 2017-09-04         浏览量: 3347

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

代理模式的关键是,当客户端不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户端实际上访问的是替身对象。替身对象对请求做出一些处理之后,在把请求转交给本体对象。


例子1:代理实现图片预加载 (虚拟代理)



var myImg = (function(){
    var image = document.createElement('img');
    document.body.appendChild(image);
    
    return {
        setSrc: function(src){
            image = src;
        }
    }
})();

var proxyImg = (function(){
    var img = new Image;
    img.onload = function(){
        myImg.setSrc(this.src);
    }
    
    return {
        setSrc : function(src){
            myImg.setSrc('file:// D:/img/1.jpg');
            img.src = src;
        }
    }
    
})();

proxyImg.setSrc('http://imgcache.qq.com/photo/123.jpg');



例子2:计算乘积 (缓存代理



//创建乘积函数
var mult = function(){
    var a=1;
    for(var i= 0,l = arguments.length;i<l;i++){
        a= a*arguments[i];
    }
    return a;
};

//加入缓存代理函数
var proxyMult = (function(){
    var cache = {};
    return function(){
        var args = Array.prototype.join.call(arguments,'');
        if(args in cache){
            return cache[args];
        }
        return cache[args] = mult.apply(this, arguments);
    }
})();



缓存代理用于ajax 异步请求数据。在项目中遇到分页需求,同一页的数据理论上只需要去后台拉去一次,这些拉去的数据在某个地方缓存起来之后,下次请求在同一页的时候,便可以直接使用之前的数据。