美文网首页
JavaScript代理模式

JavaScript代理模式

作者: 晓蟲QwQ | 来源:发表于2020-12-29 01:29 被阅读0次

代理模式是在请求对象与响应对象之间添加一个对象,负责接受请求,进行一定处理后再发送请求。如缓存,图片预加载,合并HTTP请求,拒绝非法请求等。

虚拟代理实现图片预加载

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

var proxyImage = (function(){
    var img = new Image;
    img.onload = function(){
        myImage.setSrc(this.src);
    }
    return {
        setSrc: function( src ){
            myImage.setSrc( 'loading.gif' );
            img.src = src;
        }
    }
})();

proxyImage.setSrc('resour.jpg');

虚拟代理合并HTTP请求

<input type="checkbox" id="1" />1
<input type="checkbox" id="2" />2
<input type="checkbox" id="3" />3
<input type="checkbox" id="4" />4
<input type="checkbox" id="5" />5
<input type="checkbox" id="6" />6
<input type="checkbox" id="7" />7
var synchronousFile = function( id ){
    console.log( '开始同步文件,id为:' + id );
};

var proxySynchronousFile = (function() {
    var cache = [],   // 保存一段时间内需要同步的ID
        timer;        // 定时器
    
    return function( id ){
        cache.push( id );
        if( timer ){      // 保证不会覆盖已经启动的定时器
            return;
        }
        
        timer = setTimeout(function(){
            synchronousFile( cache.join(';'));      // 2秒后向本体发送需要同步的ID集合
            clearImmediate( timer );    // 清空定时器
            timer = null;
            cache.length = 0;  // 清空ID集合
        },2000);
    }
})();

var checkbox = document.getElementsByTagName('input');

for( var i = 0,c; c = checkbox[ i++ ]; ){
    c.onclick = function(){
        if ( this.checked === true ){
            proxySynchronousFile( this.id );
        }
    }
}

虚拟代理惰性加载js文件

代理接受请求,未必需要返回响应,代理在请求需要响应时才去下载对应js文件,并将请求提交到本体。

以下代码在接受请求后并不会返回响应,只有在按下F2时才会下载应用并提交请求,返回响应

var miniConsole = (function(){
    var cache = [];
    var handler = function(ev){
        if( ev.keyCode === 113 ){
            var script = document.createElement('script');
            script.onload = function(){
                for( var i = 0,fn;fn = cache[ i++ ];){
                    fn();
                }
            };
            script.src = 'miniConsole.js';
            document.getElementsByTagName('head')[0].appendChild( script );
            document.body.removeEventListener('keydown', handler); //只加载一次miniConsole.js
        }
    };
    
    document.body.addEventListener('keydown',handler,false);
    
    return {
        log: function(){
            var args = arguments;
            cache.push(function(){
                return miniConsole.log.apply( miniConsole, args );
            });
        }
    }
})();

//miniConsole.js代码。 当该文件下载完成后,miniConsole会被替换
miniConsole = {
    log:function(){
        //真正代码略
        console.log( Array.prototype.join.call( arguments ));
    }
}

缓存代理

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

/************计算加和************/
var plus = function(){
    var a = 0;
    for ( var i = 0, l = arguments.length; i < l; i++){
        a = a + arguments[i];
    }
    return a;
};

/*************** 创建缓存代理的工厂 ************/
var createProxyFactory = function( fn ){
    var cache = {};
    return function(){
        var args = Array.prototype.join.call( arguments, ',');
        if ( args in cache){
            return cache[args];
        }
        return cache[ args ] = fn.appl( this, arguments );
    }
};

var proxyMult = createProxyFactory( mult ),
proxyPlus = createProxyFactory( plus );

alert( proxyMult( 1, 2, 3, 4) );   //输出:24
alert( proxyMult( 1, 2, 3, 4) );    //输出:24
alert( proxyPlus( 1, 2, 3, 4) );    //输出:10
alert( proxyPlus( 1, 2, 3, 4) );    //输出:10

ps:代理和本体接口应该一致,当不需要代理时,可直接使用本体

相关文章

  • JavaScript设计模式四(代理模式)

    JavaScript设计模式四(代理模式) 代理模式的定义: 代理模式是为一个对象提供一个代用品或者占位符,以便对...

  • JavaScript 代理模式

    代理模式的关键是:当客户不方便直接访问一个对象或不满足需求的时候,提供一个替身对象来控制这个对象的访问,客户实际上...

  • javascript代理模式

    代理模式是给对象提供一个代用品或占位符,以便控制对它的访问参考《javascript模式设计与开发实践》 缓存代理...

  • javascript 代理模式

    所谓的的代理模式就是为一个对象找一个替代对象,以便对原对象进行访问。 使用代理的原因是我们不愿意或者不想对原对象进...

  • JavaScript代理模式

    代理模式是在请求对象与响应对象之间添加一个对象,负责接受请求,进行一定处理后再发送请求。如缓存,图片预加载,合并H...

  • 设计模式系列笔记-代理模式

    写在前面:本系列文章内容为《JavaScript设计模式与开发实践》一书学习笔记,感谢作者曾探 代理模式 代理模式...

  • Javascript设计模式-代理模式

    特点 1.使用者无法直接访问目标对象 2.使用者和目标对象之间加一层代理,通过代理来授权和控制 例如:访问gith...

  • JavaScript设计模式——代理模式

    代理模式 代理的概念 由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介的作用 以上...

  • JavaScript设计模式——代理模式

    代理模式属于设计模式中结构型的设计模式; 定义:顾名思义就是为一个对象提供一个代用品或占位符,以便控制对它的访问!...

  • JavaScript设计模式——代理模式

    代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 代理模式是一种非常有意义的模式,在生活中可以找到...

网友评论

      本文标题:JavaScript代理模式

      本文链接:https://www.haomeiwen.com/subject/taranktx.html