代理模式

作者: 阿蒙 时间: 2020-2-23 标签: 设计模式 浏览: 1680 评论: 0

定义: 为一个对象提供一个代用品或者占位符,以便控制对它的访问。

保护代理: 过滤掉一些请求,用于控制不同权限的对象对目标目标对象的访问。

虚拟代理:把一些开销很大的对象延迟到真正需要同他的时候才去创建。 

缓存代理:为一些开销很大操作提供暂时的存储。

防火墙代理, 远程代理,保护代理, 智能引用代理,写时复制代理等等

虚拟代理作用: 1. 合并请求。 2. 惰性加载

/* 保护代理 */
    let Flower = function () {};
    let C = {
      sendFlower: function (target) {
        let flower = new Flower();
        target.receiveFlower( flower );
      }
    };
    let B = {
      receiveFlower: function ( flower ) {
        A.listenGoodMood (function () {
          A.receiveFlower( flower );
        });
      }
    };
    let A = {
      receiveFlower: function ( flower ) {
        console.log( '收到花' + flower )
      },
      listenGoodMood: function (fn) {
        setTimeout(function () {
          fn();
        }, 10000)
      }
    };
    C.sendFlower(B);
    /* 虚拟代理 */
    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://本地loading.png');
          img.src = src;
        }
      }
    })();
    proxyImage.setSrc('http://远程图片.png');
    /* 缓存代理 */
    let mult = function () {
      let a = 0;
      for (let i = 0; i < arguments.length; i ++) {
        a = a * arguments[i];
      }
      return a;
    };
    let plus = function () {
      let a = 0;
      for (let i = 0; i < arguments.length; i ++) {
        a = a + arguments[i];
      }
      return a;
    };
    let createPProxyFactory = function (fn) {
      let cache = {};

      return function () {
        let args = Array.prototype.join.call(arguments, ',');
        if (args in cache) {
          return cache[args];
        }
        return cache[args] = fn.apply(this, arguments);
      }
    };
    let proxyMult = createPProxyFactory( mult ), proxtPlus = createPProxyFactory( plus );
    proxyMult(100, 200, 300);
    proxyMult(100, 200, 300);
    proxtPlus(100, 200, 300);
    proxtPlus(100, 200, 300);

0

本文相关标签: 设计模式笔记

赞助商

发表评论: