学习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 相关文章推荐
js 变量类型转换常用函数与代码[比较全]
Dec 01 Javascript
jquery js 获取时间差、时间格式具体代码
Jun 05 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
js实现单行文本向上滚动效果实例代码
Nov 28 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
Dec 03 Javascript
javascript二维数组转置实例
Jan 22 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
Mar 21 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
开发Vue树形组件的示例代码
Dec 21 Javascript
vue 实现v-for循环回来的数据动态绑定id
Nov 07 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生成略缩图代码
2012/07/16 PHP
php简单分页类实现方法
2015/02/26 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
计算机网络专业个人的自我评价
2013/10/17 职场文书
双十佳事迹材料
2014/01/29 职场文书
小学生考试获奖感言
2014/01/30 职场文书
赔偿协议书范本
2014/04/15 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python