设计模式 -- 代理模式

2019-06-18 00:00:00

如何控制对对象的访问?

前言

代理模式,即对一个对象设置代理,以控制对该对象的访问。

常用代理模式:

  • 保护代理

代理可以过滤掉对对象的不必要访问

  • 虚拟代理

代理先收集访问请求,处理,在必要的时候再对对象进行访问。原则是收集请求

叫虚拟代理的原因:最后肯定会访问对象,只不过在代理处进行了延迟,就像是虚拟了一个对象进行访问。

图片预加载

let imgEle = function () {
    let img = document.createElement('img')
    document.body.appendChild(img)
    return {
        setSrc (src) {
            img.src = src
        }
    }
}()

let imgProxy = function (src) {
    let img = new Image()
    img.onload = function () {
        imgEle.src = src
    }
    return {
        setSrc (src) {
            img.src = src
            imgEle.setSrc('loading.gif')
        }
    }
}

此处代理了加载图片的过程,加载完图片之后才必须访问原 img添加 src,所以这是一个虚拟代理。

需要注意,尽可能保持代理方法与原方法用法一致。

  • 缓存代理

对一些开销较大的运算进行缓存处理

//计算乘积
let mult = function(){
    let result = 1;
    for(let i = 0,len = arguments.length;i < len;i++){
        result*= arguments[i];
    }
    return result;
}

//缓存代理
let proxy = (function(){
    let cache = {};
    reutrn function(){
        let args = Array.prototype.join.call(arguments,',');
        if(args in cache){
            return cache[args];
        }
        return cache[args] = mult.apply(this,arguments);
    }
})();

Gitalking ...

Markdown is supported

Be the first guy leaving a comment!