zoukankan      html  css  js  c++  java
  • js代理模式,处理缓存

     

    实战经常用的

    先创建一个用于求乘积的函数:
    var mult = function(){
    console.log( '开始计算乘积' );
    var a = 1;
    for ( var i = 0, l = arguments.length; i < l; i++ ){
    a = a * arguments[i];
    }
    return a;
    };
    mult( 2, 3 ); // 输出:6
    mult( 2, 3, 4 ); // 输出:24
    现在加入缓存代理函数:
    var proxyMult = (function(){
    var cache = {};
    return function(){
    var 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

    当我们第二次调用 proxyMult( 1, 2, 3, 4 ) 的时候,本体 mult 函数并没有被计算, proxyMult
    直接返回了之前缓存好的计算结果。
    通过增加缓存代理的方式, mult 函数可以继续专注于自身的职责——计算乘积,缓存的功能
    是由代理对象实现的。

    用高阶函数动态创建代理

    通过传入高阶函数这种更加灵活的方式,可以为各种计算方法创建缓存代理。现在这些计算,

    方法被当作参数传入一个专门用于创建缓存代理的工厂中, 这样一来,我们就可以为乘法、加
    法、减法等创建缓存代理,代码如下:

    /**************** 计算乘积 *****************/
    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 = a + arguments[i];
    }
    return a;
    };
    /**************** 创建缓存代理的工厂 *****************/
    var createProxyFactory = function( fn ){
    var cache = {};
    return function(){
    var args = Array.prototype.join.call( arguments, ',' );
    if ( args in cache ){
    return cache[ args ];
    }
    return cache[ args ] = fn.apply( this, arguments );
    }
    };
    var proxyMult = createProxyFactory( mult ),
    proxyPlus = createProxyFactory( plus );
    alert ( proxyMult( 1, 2, 3, 4 ) ); // 输出:24
    alert ( proxyMult( 1, 2, 3, 4 ) ); // 输出:24
    alert ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10
    alert ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10
  • 相关阅读:
    WPF 文本动画 文字BaseLine 字体 行高计算说明
    C#查找窗口,并控制窗口显示隐藏,通过改变窗口样式方式
    c#获取状态栏图标并-模拟鼠标点击-模拟鼠标点击窗体的某些按钮
    IEC 104公约 解析 c#使用通过104公约同步时间
    hprose数据可视化显示,通过c#序列化,列表形式展示,导出excel、csv
    微服务优秀博文资料
    IT 常用单词表
    java 优秀开源项目
    java并发编程学习博客
    LDAP服务端
  • 原文地址:https://www.cnblogs.com/TTblog5/p/13160522.html
Copyright © 2011-2022 走看看