学习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 相关文章推荐
jquery插件制作简单示例说明
Feb 03 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
jQuery中html()方法用法实例
Dec 25 Javascript
图解JavaScript中的this关键字
May 28 Javascript
jQuery ztree实现动态树形多选菜单
Aug 12 Javascript
通过jquery实现页面的动画效果(实例代码)
Sep 18 Javascript
完美的js div拖拽实例代码
Sep 24 Javascript
js判断数组是否包含某个字符串变量的实例
Nov 24 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
Dec 19 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
一起深入理解js中的事件对象
Feb 06 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
thinkphp实现数组分页示例
2014/04/13 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
$()JS小技巧
2007/07/21 Javascript
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
青年创业培训欢迎词
2014/01/08 职场文书
顶岗实习计划书
2014/01/10 职场文书
暑假家长评语大全
2014/04/17 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
伦敦奥运会口号
2014/06/13 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
创业计划书之家教托管
2019/09/25 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python
vue3不同环境下实现配置代理
2022/05/25 Vue.js
Android 中的类文件和类加载器详情
2022/06/05 Java/Android
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS