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);

学习javascript设计模式之代理模式的更多相关文章

  1. JavaScript设计模式之代理模式

    一.代理模式概念 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象控制具体对象的引用.代理几乎可 ...

  2. JavaScript 设计模式之代理模式

    一.代理模式概念解读 1.代理模式概念文字解读 代理,顾名思义就是帮助别人做事,GOF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象 ...

  3. 第三章 --- 关于Javascript 设计模式 之 代理模式

    第一.定义: 代理模式是为一个对象提供代用品或者占位符,以便控制对它的访问. 比如说,某男生小明想向他的女神 A 表白,刚好小明认识的一个女生B 和 女神A 是好朋友,那么小明就想让 女生B 帮忙送花 ...

  4. Java学习笔记——设计模式之四.代理模式

    To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...

  5. JavaScript设计模式_03_代理模式

    代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...

  6. JavaScript设计模式(代理模式)

    一.简单的单例模式: 1.未使用代理模式的情况:小明直接给女神送花 var Flower = function() {} var xiaoming = { sendFlower: function( ...

  7. JavaScript设计模式-19.代理模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  9. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

随机推荐

  1. NIOP 膜你题

    NOIp膜你题   Day1 duliu 出题人:ZAY    1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...

  2. iOS 解决ipv6问题

    解决ipv6的方法有很多种,由于现在国内的网络运营商还在使用ipv4的网络环境,所以appstore应用不可能大范围去修改自己的服务器, 而且国内的云服务器几乎没有ipv6地址. 这里附上苹果开发平台 ...

  3. js中实现杨辉三角

    实现效果:杨辉三角 即: 提示用户输入要实现的杨辉三角行数: 请输入杨辉三角的行数: 8 代码实现后的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 ...

  4. [bzoj]1930 pacman吃豆豆

    Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...

  5. php curl使用例子

    PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯.libcurl目前支持http.https.ftp.gopher.telnet. ...

  6. Django ORM (三) 查询,删除,更新操作

    ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...

  7. CF 510b Fox And Two Dots

    Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...

  8. CodeForces 14D 树的直径 Two Paths

    给出一棵树,找出两条不相交即没有公共点的路径,使得两个路径的长度的乘积最大. 思路:枚举树中的边,将该边去掉,分成两棵树,分别求出这两棵树的直径,乘起来维护一个最大值即可. #include < ...

  9. python面试题解析(数据库和缓存)

    1.     答: 关系型数据库:Mysql,Oracel,Microsoft SQL Server 非关系型数据库:MongoDB,memcache,Redis. 2.     答:     MyI ...

  10. 数据库导入Exel,输入到浏览器

    db.php <?php require dirname(__FILE__)."/dbconfig.php";//引入配置文件 class db{ public $conn= ...