学习JavaScript设计模式(代理模式)


Posted in Javascript onDecember 03, 2015

代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问
代理模式的用处(个人理解):为了保障当前对象的单一职责(相对独立性),而需要创建另一个对象来处理调用当前对象之前的一些逻辑以提高代码的效率、状态判断等。
代理模式中最常用的是虚拟代理缓存代理

一、虚拟代理
虚拟代理是把一些开销很大的对象,延迟到真正需要它的时候才去创建执行
示例: 虚拟代理实现图片预加载

// 图片加载函数
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("file://c:/loading.png");
      img.src = src;
    }
  }
})();

// 调用代理对象加载图片
proxyImage.setSrc( "http://images/qq.jpg");

示例: 虚拟代理合并HTTP请求
假设一个功能需要频繁的进行网络请求,这会造成相当大的开销,解决方案是通过一个代理函数来收集一段时间之内的请求,一次性发给服务器。
例如:做一个文件同步的功能,当我们选中一个文件时,就同步到另外一台备用服务器上

// 文件同步函数
var synchronousFile = function( id ){
  console.log( "开始同步文件,id为:" + id );
}
// 使用代理合并请求
var proxySynchronousFile = (function(){
  var cache = [], // 保存一段时间内需要同步的ID
    timer; // 定时器指针

  return function( id ){
    cache[cache.length] = id;
    if( timer ){
      return;
    }

    timer = setTimeout( function(){
      proxySynchronousFile( cache.join( "," ) ); // 2s 后向本体发送需要同步的ID集合
      clearTimeout( timer ); // 清空定时器
      timer = null;
      cache = []; // 晴空定时器
    },2000 );
  }
})();

// 绑定点击事件
var checkbox = document.getElementsByTagName( "input" );

for(var i= 0, c; c = checkbox[i++]; ){
  c.onclick = function(){
    if( this.checked === true ){
      // 使用代理进行文件同步
      proxySynchronousFile( this.id );
    }
  }
}

二、 缓存代理
缓存代理可以为一些开销大的运算结果提供暂时的存储,在下次运算时,如果传递进来的参数跟之前一致,则可以返回前面的运算结果。
示例: 为乘法、加法等创建缓存代理

// 计算乘积
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 += arguments[i];
  }
  return a;
};
// 创建缓存代理的工厂
var createProxyFactory = function( fn ){
  var cache = {}; // 缓存 - 存放参数和计算后的值
  return function(){
    var args = Array.prototype.join.call(arguments, "-");
    if( args in cache ){ // 判断出入的参数是否被计算过
      console.log( "使用缓存代理" );
      return cache[args];
    }
    return cache[args] = fn.apply( this, arguments );
  }
};
// 创建代理
var proxyMult = createProxyFactory( mult ),
  proxyPlus = createProxyFactory( plus );

console.log( proxyMult( 1, 2, 3, 4 ) ); // 输出: 24
console.log( proxyMult( 1, 2, 3, 4 ) ); // 输出: 缓存代理 24
console.log( proxyPlus( 1, 2, 3, 4 ) ); // 输出: 10
console.log( proxyPlus( 1, 2, 3, 4 ) ); // 输出: 缓存代理 10

以上三个示例为大家详细介绍了javascript代理模式,希望对大家的学习有所帮助。

Javascript 相关文章推荐
json跟xml的对比分析
Jun 10 Javascript
jQuery 遍历json数组的实现代码
Sep 22 Javascript
jquery异步循环获取功能实现代码
Sep 19 Javascript
QUnit jQuery的TDD框架
Nov 04 Javascript
Node.js事件驱动
Jun 18 Javascript
javascript动画之磁性吸附效果篇
Dec 09 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
JS实现的集合去重,交集,并集,差集功能示例
Mar 13 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 Javascript
vant IndexBar实现的城市列表的示例代码
Nov 20 Javascript
vue-property-decorator用法详解
Dec 12 Javascript
vue组件实现移动端九宫格转盘抽奖
Oct 16 Javascript
全面解析Bootstrap图片轮播效果
Dec 03 #Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
Dec 03 #Javascript
解决JavaScript数字精度丢失问题的方法
Dec 03 #Javascript
Javascript实现检测客户端类型代码封包
Dec 03 #Javascript
javascript学习小结之prototype
Dec 03 #Javascript
简单实现JS对dom操作封装
Dec 02 #Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 #Javascript
You might like
PHP 采集获取指定网址的内容
2010/01/05 PHP
PHP JSON 数据解析代码
2010/05/26 PHP
深入分析PHP引用(&amp;)
2014/09/04 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
PHP利用Mysql锁解决高并发的方法
2018/09/04 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
js验证上传图片的方法
2015/05/12 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
Python内置函数delattr的具体用法
2017/11/23 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
晚会邀请函范文
2014/01/24 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
小学新学期寄语
2014/04/02 职场文书
补充协议书范本
2014/04/23 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
项目建议书
2015/02/04 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
反邪教教育心得体会
2016/01/15 职场文书
nginx共享内存的机制详解
2022/03/21 Servers
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers