javascript 设计模式之代理模式

虚拟代理实现图片预加载

// 虚拟代理实现图片预加载

      let myImage = (function(){
        let imgNode = document.createElement('img');
        document.body.appendChild(imgNode);
        return {
          setSrc: function (src) {
            imgNode.src = src
          }
        }
      })()

      let proxyImage = (function(){
        let img = new Image;
        img.onload = function(){
          myImage.setSrc (this.src)
        }
        return {
          setSrc: function(src){
            myImage.setSrc('file:///E:/手里上整理出来的照片/网上收集的照片/山川河流.jpg');
            img.src = src
          }
        }
      })()

      proxyImage.setSrc('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560840791&di=976399fb61f71f4597347ca330dcf84a&imgtype=jpg&er=1&src=http%3A%2F%2Ffile.elecfans.com%2Fweb1%2FM00%2F81%2FF7%2Fo4YBAFw9O2aAIU4lAAKUIw4770I426.png')
      
复制代码

虚拟代理合并 HTTP 请求

<input type="checkbox" id="1" />1 
        <input type="checkbox" id="2" />2
        <input type="checkbox" id="3" />3 
        <input type="checkbox" id="4" />4
        <input type="checkbox" id="5" />6 
        <input type="checkbox" id="7" />7
        <input type="checkbox" id="8" />8 
        <input type="checkbox" id="9" />9
    <script>
        // 虚拟代理合并 HTTP 请求
      let synchronousFile = function(id) {
        console.log("开始同步文件id为" + id);
      };

      let proxySynchronousFile = (function(){
          let cache = [],
          timer;
          return function (id){
              cache.push(id);
              if (timer) { // 保证不会覆盖已经启动的定时器
                  return
              }
              timer = setTimeout(function(){
                  synchronousFile(cache.join(','));
                  clearTimeout(timer);
                  timer = null;
                  cache.length = 0; // 清空数组
              },2000)
          }
      })()

      let checkbox = document.getElementsByTagName("input");

      for (var i = 0, c; c = checkbox[i++];) {
        c.onclick = function() {
          if (this.checked === true) {
            proxySynchronousFile(this.id);
          }
        };
      }
    </script>
   
复制代码

缓存代理

let mult = function(){
          console.log('开始计算乘积');
          var a = 1;
          for(var i = 0, l = arguments.length; i < l; i++){
              a = a * arguments[i]
          }
          return a;
      };
      let proxyMult = (function(){
          let cache = {};
          return function(){
              let args = Array.prototype.join.call(arguments, ',')
              if (args in cache) {
                  return cache[ args ]
              }
              return cache[ args ] = mult.apply( this, arguments)
          }
      })();



      proxyMult(1,2,3,4) // 24
      proxyMult(1,2,3,4) // 24
复制代码

该资料来源曾探著的《设计模式与开发实践》javascript

相关文章
相关标签/搜索