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

2、不用代理模式: 客户 -> 本体  使用代理模式:  客户 -> 代理 -> 本体

3、例子场景1 点击操作与服务器交互代理 虚拟代理

   <input type="checkbox" id="1"></input>1
        <input type="checkbox" id="2"></input>2
        <input type="checkbox" id="3"></input>3
        <input type="checkbox" id="4"></input>4
        <input type="checkbox" id="5"></input>5
        <input type="checkbox" id="6"></input>6
        <input type="checkbox" id="7"></input>7
        <input type="checkbox" id="8"></input>8
        <input type="checkbox" id="9"></input>9
        <input type="checkbox" id="10"></input>10

var synchronousFile = function(id){
        console.log(id);
    }

var proxySynchronousFile = (function(){
        var cache = [],
            timer = null;
        return function(id){
            cache.push(id);
            if(timer){return;}
            timer = setTimeout(function(){
                synchronousFile(cache.join(','));
                clearTimeout(timer);
                cache.length = 0;
                timer =null;
            },2000);
        }
    })();
    var checkboxes = document.getElementsByTagName('input');
    for(var i=0,c; c=checkboxes[i++];){
        c.onclick = function(){
            if(this.checked == true){
                proxySynchronousFile(this.id);
            }
        }
    }

场景2 图片加载代理 代理和本体接口的一致性

var createImg = (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(){
        createImg.setSrc(this.src);
    }
    return {
        setSrc:function(){
            createImg.setSrc('images/loading.gif');
            this.src=src;
        }
    }

})();

场景3、求和计算 缓存代理

var mult = function(){
    var a=1;
    for(var i=0,l=arguments.length; i<l;i++){
        a = a*arguments[i];
    }
    alert(1);
    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);
    }
})();

console.log(proxyMult(2,2,2,2));
console.log(proxyMult(2,2,2,2));

/***********创建缓存代理工厂********************/

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.apply(this,arguments);
    }
})();

var proxyMult = createProxyFactory(mult);

proxyMult(2,3,4,5);

proxyMult(2,3,4,5);

最新文章

  1. [LeetCode] Balanced Binary Tree 平衡二叉树
  2. 网站CSS写在html里面的好处
  3. SharePoint固定的Footer
  4. .NET中的三种Timer的区别和用法(转)
  5. yii Query Builder (yii 查询构造器) 官方指南翻译
  6. eclipse failed to create the java virtual machine 问题图文解析(转)
  7. POJThe Doors AND NYIST 有趣的问题
  8. Python学习笔记——基础篇【第五周】——常用模块学习
  9. WCF:调用方未由服务器进行身份验证
  10. UDP传输包大小(转)
  11. 使用Python脚本操作MongoDB的教程
  12. DEVICE_ATTR实例分析
  13. Android Studio 调试各种国产手机经验总结
  14. Shc 应用
  15. Netty源码分析(前言, 概述及目录)
  16. oracle imp dmp
  17. ubuntu下设置DNS服务器
  18. java中的matches -&gt; 完全匹配
  19. RecyclerView.ItemDecoration 间隔线
  20. HDU - 59562016ACM/ICPC亚洲区沈阳站I - The Elder 树上斜率优化dp

热门文章

  1. javascript 完整知识点整理
  2. APP上线碰到的问题:Non-public API usage
  3. Linux安装项目管理工具禅道出现的一些问题
  4. percona-toolkit工具使用介绍
  5. spdlog&amp;rapidjson 使用记录
  6. Linux常用快捷键以及如何查看命令帮助
  7. Thinkphp5 的常用连式查询
  8. 数学基础:HUD1124-Factorial(N!末尾0的个数)
  9. debian右键添加在终端中打开
  10. 常用C/C++预处理指令详解